devices/e100-2.6.29-ethercat.c
author Martin Troxler <martin.troxler@komaxgroup.com>
Tue, 15 Dec 2009 10:59:07 +0100
changeset 1601 a784812c787f
parent 1506 41ca84fb6bb2
child 2421 bc2d4bf9cbe5
child 2589 2b9c78543663
permissions -rw-r--r--
master FSM enables slave FSM
slave FSM should not be active when master is scanning or configuring the slaves
1505
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     1
/******************************************************************************
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     2
 *
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     3
 *  $Id$
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     4
 *
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     5
 *  Copyright (C) 2007-2008  Florian Pose, Ingenieurgemeinschaft IgH
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     6
 *
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     7
 *  This file is part of the IgH EtherCAT Master.
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     8
 *
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     9
 *  The IgH EtherCAT Master is free software; you can redistribute it and/or
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    10
 *  modify it under the terms of the GNU General Public License version 2, as
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    11
 *  published by the Free Software Foundation.
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    12
 *
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    13
 *  The IgH EtherCAT Master is distributed in the hope that it will be useful,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    14
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    15
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    16
 *  Public License for more details.
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    17
 *
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    18
 *  You should have received a copy of the GNU General Public License along
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    19
 *  with the IgH EtherCAT Master; if not, write to the Free Software
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    20
 *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    21
 *
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    22
 *  ---
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    23
 *
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    24
 *  The license mentioned above concerns the source code only. Using the
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    25
 *  EtherCAT technology and brand is only permitted in compliance with the
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    26
 *  industrial property and similar rights of Beckhoff Automation GmbH.
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    27
 *
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    28
 *  ---
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    29
 *
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    30
 *  vim: noexpandtab
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    31
 *
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    32
 *****************************************************************************/
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    33
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    34
/**
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    35
   \file
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    36
   EtherCAT driver for e100-compatible NICs.
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    37
*/
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    38
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    39
/* Former documentation: */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    40
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    41
/*******************************************************************************
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    42
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    43
  Intel PRO/100 Linux driver
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    44
  Copyright(c) 1999 - 2006 Intel Corporation.
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    45
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    46
  This program is free software; you can redistribute it and/or modify it
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    47
  under the terms and conditions of the GNU General Public License,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    48
  version 2, as published by the Free Software Foundation.
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    49
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    50
  This program is distributed in the hope it will be useful, but WITHOUT
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    51
  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    52
  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    53
  more details.
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    54
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    55
  You should have received a copy of the GNU General Public License along with
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    56
  this program; if not, write to the Free Software Foundation, Inc.,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    57
  51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    58
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    59
  The full GNU General Public License is included in this distribution in
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    60
  the file called "COPYING".
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    61
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    62
  Contact Information:
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    63
  Linux NICS <linux.nics@intel.com>
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    64
  e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    65
  Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    66
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    67
*******************************************************************************/
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    68
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    69
/*
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    70
 *	e100.c: Intel(R) PRO/100 ethernet driver
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    71
 *
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    72
 *	(Re)written 2003 by scott.feldman@intel.com.  Based loosely on
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    73
 *	original e100 driver, but better described as a munging of
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    74
 *	e100, e1000, eepro100, tg3, 8139cp, and other drivers.
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    75
 *
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    76
 *	References:
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    77
 *		Intel 8255x 10/100 Mbps Ethernet Controller Family,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    78
 *		Open Source Software Developers Manual,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    79
 *		http://sourceforge.net/projects/e1000
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    80
 *
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    81
 *
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    82
 *	                      Theory of Operation
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    83
 *
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    84
 *	I.   General
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    85
 *
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    86
 *	The driver supports Intel(R) 10/100 Mbps PCI Fast Ethernet
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    87
 *	controller family, which includes the 82557, 82558, 82559, 82550,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    88
 *	82551, and 82562 devices.  82558 and greater controllers
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    89
 *	integrate the Intel 82555 PHY.  The controllers are used in
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    90
 *	server and client network interface cards, as well as in
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    91
 *	LAN-On-Motherboard (LOM), CardBus, MiniPCI, and ICHx
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    92
 *	configurations.  8255x supports a 32-bit linear addressing
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    93
 *	mode and operates at 33Mhz PCI clock rate.
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    94
 *
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    95
 *	II.  Driver Operation
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    96
 *
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    97
 *	Memory-mapped mode is used exclusively to access the device's
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    98
 *	shared-memory structure, the Control/Status Registers (CSR). All
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    99
 *	setup, configuration, and control of the device, including queuing
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   100
 *	of Tx, Rx, and configuration commands is through the CSR.
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   101
 *	cmd_lock serializes accesses to the CSR command register.  cb_lock
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   102
 *	protects the shared Command Block List (CBL).
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   103
 *
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   104
 *	8255x is highly MII-compliant and all access to the PHY go
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   105
 *	through the Management Data Interface (MDI).  Consequently, the
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   106
 *	driver leverages the mii.c library shared with other MII-compliant
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   107
 *	devices.
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   108
 *
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   109
 *	Big- and Little-Endian byte order as well as 32- and 64-bit
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   110
 *	archs are supported.  Weak-ordered memory and non-cache-coherent
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   111
 *	archs are supported.
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   112
 *
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   113
 *	III. Transmit
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   114
 *
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   115
 *	A Tx skb is mapped and hangs off of a TCB.  TCBs are linked
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   116
 *	together in a fixed-size ring (CBL) thus forming the flexible mode
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   117
 *	memory structure.  A TCB marked with the suspend-bit indicates
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   118
 *	the end of the ring.  The last TCB processed suspends the
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   119
 *	controller, and the controller can be restarted by issue a CU
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   120
 *	resume command to continue from the suspend point, or a CU start
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   121
 *	command to start at a given position in the ring.
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   122
 *
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   123
 *	Non-Tx commands (config, multicast setup, etc) are linked
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   124
 *	into the CBL ring along with Tx commands.  The common structure
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   125
 *	used for both Tx and non-Tx commands is the Command Block (CB).
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   126
 *
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   127
 *	cb_to_use is the next CB to use for queuing a command; cb_to_clean
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   128
 *	is the next CB to check for completion; cb_to_send is the first
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   129
 *	CB to start on in case of a previous failure to resume.  CB clean
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   130
 *	up happens in interrupt context in response to a CU interrupt.
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   131
 *	cbs_avail keeps track of number of free CB resources available.
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   132
 *
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   133
 * 	Hardware padding of short packets to minimum packet size is
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   134
 * 	enabled.  82557 pads with 7Eh, while the later controllers pad
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   135
 * 	with 00h.
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   136
 *
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   137
 *	IV.  Receive
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   138
 *
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   139
 *	The Receive Frame Area (RFA) comprises a ring of Receive Frame
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   140
 *	Descriptors (RFD) + data buffer, thus forming the simplified mode
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   141
 *	memory structure.  Rx skbs are allocated to contain both the RFD
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   142
 *	and the data buffer, but the RFD is pulled off before the skb is
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   143
 *	indicated.  The data buffer is aligned such that encapsulated
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   144
 *	protocol headers are u32-aligned.  Since the RFD is part of the
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   145
 *	mapped shared memory, and completion status is contained within
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   146
 *	the RFD, the RFD must be dma_sync'ed to maintain a consistent
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   147
 *	view from software and hardware.
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   148
 *
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   149
 *	In order to keep updates to the RFD link field from colliding with
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   150
 *	hardware writes to mark packets complete, we use the feature that
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   151
 *	hardware will not write to a size 0 descriptor and mark the previous
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   152
 *	packet as end-of-list (EL).   After updating the link, we remove EL
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   153
 *	and only then restore the size such that hardware may use the
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   154
 *	previous-to-end RFD.
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   155
 *
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   156
 *	Under typical operation, the  receive unit (RU) is start once,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   157
 *	and the controller happily fills RFDs as frames arrive.  If
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   158
 *	replacement RFDs cannot be allocated, or the RU goes non-active,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   159
 *	the RU must be restarted.  Frame arrival generates an interrupt,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   160
 *	and Rx indication and re-allocation happen in the same context,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   161
 *	therefore no locking is required.  A software-generated interrupt
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   162
 *	is generated from the watchdog to recover from a failed allocation
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   163
 *	scenario where all Rx resources have been indicated and none re-
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   164
 *	placed.
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   165
 *
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   166
 *	V.   Miscellaneous
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   167
 *
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   168
 * 	VLAN offloading of tagging, stripping and filtering is not
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   169
 * 	supported, but driver will accommodate the extra 4-byte VLAN tag
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   170
 * 	for processing by upper layers.  Tx/Rx Checksum offloading is not
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   171
 * 	supported.  Tx Scatter/Gather is not supported.  Jumbo Frames is
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   172
 * 	not supported (hardware limitation).
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   173
 *
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   174
 * 	MagicPacket(tm) WoL support is enabled/disabled via ethtool.
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   175
 *
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   176
 * 	Thanks to JC (jchapman@katalix.com) for helping with
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   177
 * 	testing/troubleshooting the development driver.
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   178
 *
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   179
 * 	TODO:
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   180
 * 	o several entry points race with dev->close
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   181
 * 	o check for tx-no-resources/stop Q races with tx clean/wake Q
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   182
 *
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   183
 *	FIXES:
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   184
 * 2005/12/02 - Michael O'Donnell <Michael.ODonnell at stratus dot com>
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   185
 *	- Stratus87247: protect MDI control register manipulations
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   186
 */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   187
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   188
#include <linux/module.h>
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   189
#include <linux/moduleparam.h>
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   190
#include <linux/kernel.h>
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   191
#include <linux/types.h>
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   192
#include <linux/slab.h>
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   193
#include <linux/delay.h>
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   194
#include <linux/init.h>
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   195
#include <linux/pci.h>
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   196
#include <linux/dma-mapping.h>
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   197
#include <linux/netdevice.h>
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   198
#include <linux/etherdevice.h>
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   199
#include <linux/mii.h>
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   200
#include <linux/if_vlan.h>
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   201
#include <linux/skbuff.h>
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   202
#include <linux/ethtool.h>
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   203
#include <linux/string.h>
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   204
#include <linux/firmware.h>
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   205
#include <asm/unaligned.h>
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   206
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   207
// EtherCAT includes
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   208
#include "../globals.h"
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   209
#include "ecdev.h"
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   210
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   211
#define DRV_NAME		"ec_e100"
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   212
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   213
#define DRV_EXT			"-NAPI"
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   214
#define DRV_VERSION		"3.5.23-k6"DRV_EXT
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   215
#define DRV_DESCRIPTION		"Intel(R) PRO/100 Network Driver"
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   216
#define DRV_COPYRIGHT		"Copyright(c) 1999-2006 Intel Corporation"
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   217
#define PFX			DRV_NAME ": "
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   218
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   219
#define E100_WATCHDOG_PERIOD	(2 * HZ)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   220
#define E100_NAPI_WEIGHT	16
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   221
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   222
#define FIRMWARE_D101M		"e100/d101m_ucode.bin"
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   223
#define FIRMWARE_D101S		"e100/d101s_ucode.bin"
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   224
#define FIRMWARE_D102E		"e100/d102e_ucode.bin"
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   225
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   226
MODULE_DESCRIPTION(DRV_DESCRIPTION);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   227
MODULE_AUTHOR(DRV_COPYRIGHT);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   228
MODULE_LICENSE("GPL");
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   229
MODULE_VERSION(DRV_VERSION);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   230
MODULE_FIRMWARE(FIRMWARE_D101M);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   231
MODULE_FIRMWARE(FIRMWARE_D101S);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   232
MODULE_FIRMWARE(FIRMWARE_D102E);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   233
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   234
MODULE_DESCRIPTION(DRV_DESCRIPTION);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   235
MODULE_AUTHOR("Mario Witkowski <mario.witkowski@w4systems.de>");
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   236
MODULE_LICENSE("GPL");
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   237
MODULE_VERSION(DRV_VERSION ", master " EC_MASTER_VERSION);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   238
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   239
void e100_ec_poll(struct net_device *);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   240
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   241
static int debug = 3;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   242
static int eeprom_bad_csum_allow = 0;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   243
static int use_io = 0;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   244
module_param(debug, int, 0);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   245
module_param(eeprom_bad_csum_allow, int, 0);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   246
module_param(use_io, int, 0);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   247
MODULE_PARM_DESC(debug, "Debug level (0=none,...,16=all)");
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   248
MODULE_PARM_DESC(eeprom_bad_csum_allow, "Allow bad eeprom checksums");
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   249
MODULE_PARM_DESC(use_io, "Force use of i/o access mode");
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   250
#define DPRINTK(nlevel, klevel, fmt, args...) \
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   251
	(void)((NETIF_MSG_##nlevel & nic->msg_enable) && \
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   252
	printk(KERN_##klevel PFX "%s: %s: " fmt, nic->netdev->name, \
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   253
		__func__ , ## args))
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   254
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   255
#define INTEL_8255X_ETHERNET_DEVICE(device_id, ich) {\
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   256
	PCI_VENDOR_ID_INTEL, device_id, PCI_ANY_ID, PCI_ANY_ID, \
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   257
	PCI_CLASS_NETWORK_ETHERNET << 8, 0xFFFF00, ich }
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   258
static struct pci_device_id e100_id_table[] = {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   259
	INTEL_8255X_ETHERNET_DEVICE(0x1029, 0),
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   260
	INTEL_8255X_ETHERNET_DEVICE(0x1030, 0),
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   261
	INTEL_8255X_ETHERNET_DEVICE(0x1031, 3),
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   262
	INTEL_8255X_ETHERNET_DEVICE(0x1032, 3),
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   263
	INTEL_8255X_ETHERNET_DEVICE(0x1033, 3),
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   264
	INTEL_8255X_ETHERNET_DEVICE(0x1034, 3),
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   265
	INTEL_8255X_ETHERNET_DEVICE(0x1038, 3),
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   266
	INTEL_8255X_ETHERNET_DEVICE(0x1039, 4),
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   267
	INTEL_8255X_ETHERNET_DEVICE(0x103A, 4),
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   268
	INTEL_8255X_ETHERNET_DEVICE(0x103B, 4),
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   269
	INTEL_8255X_ETHERNET_DEVICE(0x103C, 4),
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   270
	INTEL_8255X_ETHERNET_DEVICE(0x103D, 4),
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   271
	INTEL_8255X_ETHERNET_DEVICE(0x103E, 4),
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   272
	INTEL_8255X_ETHERNET_DEVICE(0x1050, 5),
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   273
	INTEL_8255X_ETHERNET_DEVICE(0x1051, 5),
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   274
	INTEL_8255X_ETHERNET_DEVICE(0x1052, 5),
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   275
	INTEL_8255X_ETHERNET_DEVICE(0x1053, 5),
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   276
	INTEL_8255X_ETHERNET_DEVICE(0x1054, 5),
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   277
	INTEL_8255X_ETHERNET_DEVICE(0x1055, 5),
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   278
	INTEL_8255X_ETHERNET_DEVICE(0x1056, 5),
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   279
	INTEL_8255X_ETHERNET_DEVICE(0x1057, 5),
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   280
	INTEL_8255X_ETHERNET_DEVICE(0x1059, 0),
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   281
	INTEL_8255X_ETHERNET_DEVICE(0x1064, 6),
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   282
	INTEL_8255X_ETHERNET_DEVICE(0x1065, 6),
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   283
	INTEL_8255X_ETHERNET_DEVICE(0x1066, 6),
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   284
	INTEL_8255X_ETHERNET_DEVICE(0x1067, 6),
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   285
	INTEL_8255X_ETHERNET_DEVICE(0x1068, 6),
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   286
	INTEL_8255X_ETHERNET_DEVICE(0x1069, 6),
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   287
	INTEL_8255X_ETHERNET_DEVICE(0x106A, 6),
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   288
	INTEL_8255X_ETHERNET_DEVICE(0x106B, 6),
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   289
	INTEL_8255X_ETHERNET_DEVICE(0x1091, 7),
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   290
	INTEL_8255X_ETHERNET_DEVICE(0x1092, 7),
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   291
	INTEL_8255X_ETHERNET_DEVICE(0x1093, 7),
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   292
	INTEL_8255X_ETHERNET_DEVICE(0x1094, 7),
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   293
	INTEL_8255X_ETHERNET_DEVICE(0x1095, 7),
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   294
	INTEL_8255X_ETHERNET_DEVICE(0x1209, 0),
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   295
	INTEL_8255X_ETHERNET_DEVICE(0x1229, 0),
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   296
	INTEL_8255X_ETHERNET_DEVICE(0x2449, 2),
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   297
	INTEL_8255X_ETHERNET_DEVICE(0x2459, 2),
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   298
	INTEL_8255X_ETHERNET_DEVICE(0x245D, 2),
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   299
	INTEL_8255X_ETHERNET_DEVICE(0x27DC, 7),
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   300
	{ 0, }
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   301
};
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   302
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   303
// prevent from being loaded automatically
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   304
//MODULE_DEVICE_TABLE(pci, e100_id_table);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   305
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   306
enum mac {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   307
	mac_82557_D100_A  = 0,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   308
	mac_82557_D100_B  = 1,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   309
	mac_82557_D100_C  = 2,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   310
	mac_82558_D101_A4 = 4,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   311
	mac_82558_D101_B0 = 5,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   312
	mac_82559_D101M   = 8,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   313
	mac_82559_D101S   = 9,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   314
	mac_82550_D102    = 12,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   315
	mac_82550_D102_C  = 13,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   316
	mac_82551_E       = 14,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   317
	mac_82551_F       = 15,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   318
	mac_82551_10      = 16,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   319
	mac_unknown       = 0xFF,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   320
};
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   321
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   322
enum phy {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   323
	phy_100a     = 0x000003E0,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   324
	phy_100c     = 0x035002A8,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   325
	phy_82555_tx = 0x015002A8,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   326
	phy_nsc_tx   = 0x5C002000,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   327
	phy_82562_et = 0x033002A8,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   328
	phy_82562_em = 0x032002A8,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   329
	phy_82562_ek = 0x031002A8,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   330
	phy_82562_eh = 0x017002A8,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   331
	phy_unknown  = 0xFFFFFFFF,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   332
};
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   333
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   334
/* CSR (Control/Status Registers) */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   335
struct csr {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   336
	struct {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   337
		u8 status;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   338
		u8 stat_ack;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   339
		u8 cmd_lo;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   340
		u8 cmd_hi;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   341
		u32 gen_ptr;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   342
	} scb;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   343
	u32 port;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   344
	u16 flash_ctrl;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   345
	u8 eeprom_ctrl_lo;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   346
	u8 eeprom_ctrl_hi;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   347
	u32 mdi_ctrl;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   348
	u32 rx_dma_count;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   349
};
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   350
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   351
enum scb_status {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   352
	rus_no_res       = 0x08,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   353
	rus_ready        = 0x10,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   354
	rus_mask         = 0x3C,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   355
};
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   356
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   357
enum ru_state  {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   358
	RU_SUSPENDED = 0,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   359
	RU_RUNNING	 = 1,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   360
	RU_UNINITIALIZED = -1,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   361
};
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   362
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   363
enum scb_stat_ack {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   364
	stat_ack_not_ours    = 0x00,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   365
	stat_ack_sw_gen      = 0x04,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   366
	stat_ack_rnr         = 0x10,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   367
	stat_ack_cu_idle     = 0x20,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   368
	stat_ack_frame_rx    = 0x40,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   369
	stat_ack_cu_cmd_done = 0x80,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   370
	stat_ack_not_present = 0xFF,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   371
	stat_ack_rx = (stat_ack_sw_gen | stat_ack_rnr | stat_ack_frame_rx),
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   372
	stat_ack_tx = (stat_ack_cu_idle | stat_ack_cu_cmd_done),
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   373
};
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   374
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   375
enum scb_cmd_hi {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   376
	irq_mask_none = 0x00,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   377
	irq_mask_all  = 0x01,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   378
	irq_sw_gen    = 0x02,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   379
};
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   380
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   381
enum scb_cmd_lo {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   382
	cuc_nop        = 0x00,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   383
	ruc_start      = 0x01,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   384
	ruc_load_base  = 0x06,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   385
	cuc_start      = 0x10,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   386
	cuc_resume     = 0x20,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   387
	cuc_dump_addr  = 0x40,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   388
	cuc_dump_stats = 0x50,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   389
	cuc_load_base  = 0x60,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   390
	cuc_dump_reset = 0x70,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   391
};
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   392
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   393
enum cuc_dump {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   394
	cuc_dump_complete       = 0x0000A005,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   395
	cuc_dump_reset_complete = 0x0000A007,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   396
};
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   397
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   398
enum port {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   399
	software_reset  = 0x0000,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   400
	selftest        = 0x0001,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   401
	selective_reset = 0x0002,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   402
};
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   403
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   404
enum eeprom_ctrl_lo {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   405
	eesk = 0x01,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   406
	eecs = 0x02,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   407
	eedi = 0x04,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   408
	eedo = 0x08,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   409
};
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   410
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   411
enum mdi_ctrl {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   412
	mdi_write = 0x04000000,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   413
	mdi_read  = 0x08000000,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   414
	mdi_ready = 0x10000000,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   415
};
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   416
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   417
enum eeprom_op {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   418
	op_write = 0x05,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   419
	op_read  = 0x06,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   420
	op_ewds  = 0x10,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   421
	op_ewen  = 0x13,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   422
};
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   423
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   424
enum eeprom_offsets {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   425
	eeprom_cnfg_mdix  = 0x03,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   426
	eeprom_id         = 0x0A,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   427
	eeprom_config_asf = 0x0D,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   428
	eeprom_smbus_addr = 0x90,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   429
};
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   430
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   431
enum eeprom_cnfg_mdix {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   432
	eeprom_mdix_enabled = 0x0080,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   433
};
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   434
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   435
enum eeprom_id {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   436
	eeprom_id_wol = 0x0020,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   437
};
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   438
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   439
enum eeprom_config_asf {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   440
	eeprom_asf = 0x8000,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   441
	eeprom_gcl = 0x4000,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   442
};
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   443
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   444
enum cb_status {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   445
	cb_complete = 0x8000,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   446
	cb_ok       = 0x2000,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   447
};
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   448
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   449
enum cb_command {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   450
	cb_nop    = 0x0000,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   451
	cb_iaaddr = 0x0001,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   452
	cb_config = 0x0002,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   453
	cb_multi  = 0x0003,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   454
	cb_tx     = 0x0004,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   455
	cb_ucode  = 0x0005,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   456
	cb_dump   = 0x0006,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   457
	cb_tx_sf  = 0x0008,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   458
	cb_cid    = 0x1f00,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   459
	cb_i      = 0x2000,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   460
	cb_s      = 0x4000,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   461
	cb_el     = 0x8000,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   462
};
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   463
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   464
struct rfd {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   465
	__le16 status;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   466
	__le16 command;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   467
	__le32 link;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   468
	__le32 rbd;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   469
	__le16 actual_size;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   470
	__le16 size;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   471
};
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   472
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   473
struct rx {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   474
	struct rx *next, *prev;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   475
	struct sk_buff *skb;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   476
	dma_addr_t dma_addr;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   477
};
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   478
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   479
#if defined(__BIG_ENDIAN_BITFIELD)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   480
#define X(a,b)	b,a
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   481
#else
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   482
#define X(a,b)	a,b
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   483
#endif
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   484
struct config {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   485
/*0*/	u8 X(byte_count:6, pad0:2);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   486
/*1*/	u8 X(X(rx_fifo_limit:4, tx_fifo_limit:3), pad1:1);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   487
/*2*/	u8 adaptive_ifs;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   488
/*3*/	u8 X(X(X(X(mwi_enable:1, type_enable:1), read_align_enable:1),
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   489
	   term_write_cache_line:1), pad3:4);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   490
/*4*/	u8 X(rx_dma_max_count:7, pad4:1);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   491
/*5*/	u8 X(tx_dma_max_count:7, dma_max_count_enable:1);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   492
/*6*/	u8 X(X(X(X(X(X(X(late_scb_update:1, direct_rx_dma:1),
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   493
	   tno_intr:1), cna_intr:1), standard_tcb:1), standard_stat_counter:1),
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   494
	   rx_discard_overruns:1), rx_save_bad_frames:1);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   495
/*7*/	u8 X(X(X(X(X(rx_discard_short_frames:1, tx_underrun_retry:2),
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   496
	   pad7:2), rx_extended_rfd:1), tx_two_frames_in_fifo:1),
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   497
	   tx_dynamic_tbd:1);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   498
/*8*/	u8 X(X(mii_mode:1, pad8:6), csma_disabled:1);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   499
/*9*/	u8 X(X(X(X(X(rx_tcpudp_checksum:1, pad9:3), vlan_arp_tco:1),
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   500
	   link_status_wake:1), arp_wake:1), mcmatch_wake:1);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   501
/*10*/	u8 X(X(X(pad10:3, no_source_addr_insertion:1), preamble_length:2),
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   502
	   loopback:2);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   503
/*11*/	u8 X(linear_priority:3, pad11:5);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   504
/*12*/	u8 X(X(linear_priority_mode:1, pad12:3), ifs:4);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   505
/*13*/	u8 ip_addr_lo;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   506
/*14*/	u8 ip_addr_hi;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   507
/*15*/	u8 X(X(X(X(X(X(X(promiscuous_mode:1, broadcast_disabled:1),
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   508
	   wait_after_win:1), pad15_1:1), ignore_ul_bit:1), crc_16_bit:1),
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   509
	   pad15_2:1), crs_or_cdt:1);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   510
/*16*/	u8 fc_delay_lo;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   511
/*17*/	u8 fc_delay_hi;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   512
/*18*/	u8 X(X(X(X(X(rx_stripping:1, tx_padding:1), rx_crc_transfer:1),
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   513
	   rx_long_ok:1), fc_priority_threshold:3), pad18:1);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   514
/*19*/	u8 X(X(X(X(X(X(X(addr_wake:1, magic_packet_disable:1),
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   515
	   fc_disable:1), fc_restop:1), fc_restart:1), fc_reject:1),
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   516
	   full_duplex_force:1), full_duplex_pin:1);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   517
/*20*/	u8 X(X(X(pad20_1:5, fc_priority_location:1), multi_ia:1), pad20_2:1);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   518
/*21*/	u8 X(X(pad21_1:3, multicast_all:1), pad21_2:4);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   519
/*22*/	u8 X(X(rx_d102_mode:1, rx_vlan_drop:1), pad22:6);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   520
	u8 pad_d102[9];
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   521
};
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   522
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   523
#define E100_MAX_MULTICAST_ADDRS	64
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   524
struct multi {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   525
	__le16 count;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   526
	u8 addr[E100_MAX_MULTICAST_ADDRS * ETH_ALEN + 2/*pad*/];
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   527
};
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   528
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   529
/* Important: keep total struct u32-aligned */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   530
#define UCODE_SIZE			134
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   531
struct cb {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   532
	__le16 status;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   533
	__le16 command;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   534
	__le32 link;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   535
	union {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   536
		u8 iaaddr[ETH_ALEN];
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   537
		__le32 ucode[UCODE_SIZE];
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   538
		struct config config;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   539
		struct multi multi;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   540
		struct {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   541
			u32 tbd_array;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   542
			u16 tcb_byte_count;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   543
			u8 threshold;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   544
			u8 tbd_count;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   545
			struct {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   546
				__le32 buf_addr;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   547
				__le16 size;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   548
				u16 eol;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   549
			} tbd;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   550
		} tcb;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   551
		__le32 dump_buffer_addr;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   552
	} u;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   553
	struct cb *next, *prev;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   554
	dma_addr_t dma_addr;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   555
	struct sk_buff *skb;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   556
};
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   557
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   558
enum loopback {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   559
	lb_none = 0, lb_mac = 1, lb_phy = 3,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   560
};
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   561
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   562
struct stats {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   563
	__le32 tx_good_frames, tx_max_collisions, tx_late_collisions,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   564
		tx_underruns, tx_lost_crs, tx_deferred, tx_single_collisions,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   565
		tx_multiple_collisions, tx_total_collisions;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   566
	__le32 rx_good_frames, rx_crc_errors, rx_alignment_errors,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   567
		rx_resource_errors, rx_overrun_errors, rx_cdt_errors,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   568
		rx_short_frame_errors;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   569
	__le32 fc_xmt_pause, fc_rcv_pause, fc_rcv_unsupported;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   570
	__le16 xmt_tco_frames, rcv_tco_frames;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   571
	__le32 complete;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   572
};
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   573
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   574
struct mem {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   575
	struct {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   576
		u32 signature;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   577
		u32 result;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   578
	} selftest;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   579
	struct stats stats;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   580
	u8 dump_buf[596];
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   581
};
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   582
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   583
struct param_range {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   584
	u32 min;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   585
	u32 max;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   586
	u32 count;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   587
};
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   588
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   589
struct params {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   590
	struct param_range rfds;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   591
	struct param_range cbs;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   592
};
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   593
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   594
struct nic {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   595
	/* Begin: frequently used values: keep adjacent for cache effect */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   596
	u32 msg_enable				____cacheline_aligned;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   597
	struct net_device *netdev;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   598
	struct pci_dev *pdev;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   599
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   600
	struct rx *rxs				____cacheline_aligned;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   601
	struct rx *rx_to_use;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   602
	struct rx *rx_to_clean;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   603
	struct rfd blank_rfd;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   604
	enum ru_state ru_running;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   605
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   606
	spinlock_t cb_lock			____cacheline_aligned;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   607
	spinlock_t cmd_lock;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   608
	struct csr __iomem *csr;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   609
	enum scb_cmd_lo cuc_cmd;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   610
	unsigned int cbs_avail;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   611
	struct napi_struct napi;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   612
	struct cb *cbs;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   613
	struct cb *cb_to_use;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   614
	struct cb *cb_to_send;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   615
	struct cb *cb_to_clean;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   616
	__le16 tx_command;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   617
	/* End: frequently used values: keep adjacent for cache effect */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   618
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   619
	enum {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   620
		ich                = (1 << 0),
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   621
		promiscuous        = (1 << 1),
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   622
		multicast_all      = (1 << 2),
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   623
		wol_magic          = (1 << 3),
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   624
		ich_10h_workaround = (1 << 4),
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   625
	} flags					____cacheline_aligned;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   626
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   627
	enum mac mac;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   628
	enum phy phy;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   629
	struct params params;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   630
	struct timer_list watchdog;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   631
	struct timer_list blink_timer;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   632
	struct mii_if_info mii;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   633
	struct work_struct tx_timeout_task;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   634
	enum loopback loopback;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   635
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   636
	struct mem *mem;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   637
	dma_addr_t dma_addr;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   638
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   639
	dma_addr_t cbs_dma_addr;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   640
	u8 adaptive_ifs;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   641
	u8 tx_threshold;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   642
	u32 tx_frames;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   643
	u32 tx_collisions;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   644
	u32 tx_deferred;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   645
	u32 tx_single_collisions;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   646
	u32 tx_multiple_collisions;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   647
	u32 tx_fc_pause;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   648
	u32 tx_tco_frames;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   649
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   650
	u32 rx_fc_pause;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   651
	u32 rx_fc_unsupported;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   652
	u32 rx_tco_frames;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   653
	u32 rx_over_length_errors;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   654
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   655
	u16 leds;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   656
	u16 eeprom_wc;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   657
	__le16 eeprom[256];
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   658
	spinlock_t mdio_lock;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   659
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   660
	ec_device_t *ecdev;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   661
	unsigned long ec_watchdog_jiffies;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   662
};
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   663
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   664
static inline void e100_write_flush(struct nic *nic)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   665
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   666
	/* Flush previous PCI writes through intermediate bridges
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   667
	 * by doing a benign read */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   668
	(void)ioread8(&nic->csr->scb.status);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   669
}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   670
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   671
static void e100_enable_irq(struct nic *nic)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   672
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   673
	unsigned long flags;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   674
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   675
	if (nic->ecdev)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   676
		return;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   677
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   678
	spin_lock_irqsave(&nic->cmd_lock, flags);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   679
	iowrite8(irq_mask_none, &nic->csr->scb.cmd_hi);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   680
	e100_write_flush(nic);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   681
	spin_unlock_irqrestore(&nic->cmd_lock, flags);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   682
}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   683
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   684
static void e100_disable_irq(struct nic *nic)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   685
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   686
	unsigned long flags = 0;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   687
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   688
	if (!nic->ecdev)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   689
		spin_lock_irqsave(&nic->cmd_lock, flags);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   690
	iowrite8(irq_mask_all, &nic->csr->scb.cmd_hi);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   691
	e100_write_flush(nic);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   692
	if (!nic->ecdev)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   693
		spin_unlock_irqrestore(&nic->cmd_lock, flags);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   694
}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   695
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   696
static void e100_hw_reset(struct nic *nic)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   697
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   698
	/* Put CU and RU into idle with a selective reset to get
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   699
	 * device off of PCI bus */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   700
	iowrite32(selective_reset, &nic->csr->port);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   701
	e100_write_flush(nic); udelay(20);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   702
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   703
	/* Now fully reset device */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   704
	iowrite32(software_reset, &nic->csr->port);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   705
	e100_write_flush(nic); udelay(20);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   706
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   707
	/* Mask off our interrupt line - it's unmasked after reset */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   708
	e100_disable_irq(nic);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   709
}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   710
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   711
static int e100_self_test(struct nic *nic)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   712
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   713
	u32 dma_addr = nic->dma_addr + offsetof(struct mem, selftest);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   714
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   715
	/* Passing the self-test is a pretty good indication
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   716
	 * that the device can DMA to/from host memory */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   717
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   718
	nic->mem->selftest.signature = 0;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   719
	nic->mem->selftest.result = 0xFFFFFFFF;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   720
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   721
	iowrite32(selftest | dma_addr, &nic->csr->port);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   722
	e100_write_flush(nic);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   723
	/* Wait 10 msec for self-test to complete */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   724
	msleep(10);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   725
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   726
	/* Interrupts are enabled after self-test */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   727
	e100_disable_irq(nic);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   728
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   729
	/* Check results of self-test */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   730
	if (nic->mem->selftest.result != 0) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   731
		DPRINTK(HW, ERR, "Self-test failed: result=0x%08X\n",
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   732
			nic->mem->selftest.result);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   733
		return -ETIMEDOUT;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   734
	}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   735
	if (nic->mem->selftest.signature == 0) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   736
		DPRINTK(HW, ERR, "Self-test failed: timed out\n");
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   737
		return -ETIMEDOUT;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   738
	}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   739
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   740
	return 0;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   741
}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   742
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   743
static void e100_eeprom_write(struct nic *nic, u16 addr_len, u16 addr, __le16 data)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   744
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   745
	u32 cmd_addr_data[3];
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   746
	u8 ctrl;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   747
	int i, j;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   748
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   749
	/* Three cmds: write/erase enable, write data, write/erase disable */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   750
	cmd_addr_data[0] = op_ewen << (addr_len - 2);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   751
	cmd_addr_data[1] = (((op_write << addr_len) | addr) << 16) |
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   752
		le16_to_cpu(data);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   753
	cmd_addr_data[2] = op_ewds << (addr_len - 2);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   754
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   755
	/* Bit-bang cmds to write word to eeprom */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   756
	for (j = 0; j < 3; j++) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   757
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   758
		/* Chip select */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   759
		iowrite8(eecs | eesk, &nic->csr->eeprom_ctrl_lo);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   760
		e100_write_flush(nic); udelay(4);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   761
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   762
		for (i = 31; i >= 0; i--) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   763
			ctrl = (cmd_addr_data[j] & (1 << i)) ?
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   764
				eecs | eedi : eecs;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   765
			iowrite8(ctrl, &nic->csr->eeprom_ctrl_lo);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   766
			e100_write_flush(nic); udelay(4);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   767
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   768
			iowrite8(ctrl | eesk, &nic->csr->eeprom_ctrl_lo);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   769
			e100_write_flush(nic); udelay(4);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   770
		}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   771
		/* Wait 10 msec for cmd to complete */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   772
		msleep(10);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   773
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   774
		/* Chip deselect */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   775
		iowrite8(0, &nic->csr->eeprom_ctrl_lo);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   776
		e100_write_flush(nic); udelay(4);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   777
	}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   778
};
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   779
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   780
/* General technique stolen from the eepro100 driver - very clever */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   781
static __le16 e100_eeprom_read(struct nic *nic, u16 *addr_len, u16 addr)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   782
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   783
	u32 cmd_addr_data;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   784
	u16 data = 0;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   785
	u8 ctrl;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   786
	int i;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   787
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   788
	cmd_addr_data = ((op_read << *addr_len) | addr) << 16;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   789
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   790
	/* Chip select */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   791
	iowrite8(eecs | eesk, &nic->csr->eeprom_ctrl_lo);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   792
	e100_write_flush(nic); udelay(4);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   793
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   794
	/* Bit-bang to read word from eeprom */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   795
	for (i = 31; i >= 0; i--) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   796
		ctrl = (cmd_addr_data & (1 << i)) ? eecs | eedi : eecs;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   797
		iowrite8(ctrl, &nic->csr->eeprom_ctrl_lo);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   798
		e100_write_flush(nic); udelay(4);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   799
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   800
		iowrite8(ctrl | eesk, &nic->csr->eeprom_ctrl_lo);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   801
		e100_write_flush(nic); udelay(4);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   802
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   803
		/* Eeprom drives a dummy zero to EEDO after receiving
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   804
		 * complete address.  Use this to adjust addr_len. */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   805
		ctrl = ioread8(&nic->csr->eeprom_ctrl_lo);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   806
		if (!(ctrl & eedo) && i > 16) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   807
			*addr_len -= (i - 16);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   808
			i = 17;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   809
		}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   810
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   811
		data = (data << 1) | (ctrl & eedo ? 1 : 0);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   812
	}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   813
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   814
	/* Chip deselect */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   815
	iowrite8(0, &nic->csr->eeprom_ctrl_lo);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   816
	e100_write_flush(nic); udelay(4);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   817
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   818
	return cpu_to_le16(data);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   819
};
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   820
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   821
/* Load entire EEPROM image into driver cache and validate checksum */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   822
static int e100_eeprom_load(struct nic *nic)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   823
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   824
	u16 addr, addr_len = 8, checksum = 0;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   825
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   826
	/* Try reading with an 8-bit addr len to discover actual addr len */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   827
	e100_eeprom_read(nic, &addr_len, 0);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   828
	nic->eeprom_wc = 1 << addr_len;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   829
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   830
	for (addr = 0; addr < nic->eeprom_wc; addr++) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   831
		nic->eeprom[addr] = e100_eeprom_read(nic, &addr_len, addr);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   832
		if (addr < nic->eeprom_wc - 1)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   833
			checksum += le16_to_cpu(nic->eeprom[addr]);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   834
	}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   835
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   836
	/* The checksum, stored in the last word, is calculated such that
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   837
	 * the sum of words should be 0xBABA */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   838
	if (cpu_to_le16(0xBABA - checksum) != nic->eeprom[nic->eeprom_wc - 1]) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   839
		DPRINTK(PROBE, ERR, "EEPROM corrupted\n");
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   840
		if (!eeprom_bad_csum_allow)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   841
			return -EAGAIN;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   842
	}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   843
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   844
	return 0;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   845
}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   846
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   847
/* Save (portion of) driver EEPROM cache to device and update checksum */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   848
static int e100_eeprom_save(struct nic *nic, u16 start, u16 count)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   849
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   850
	u16 addr, addr_len = 8, checksum = 0;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   851
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   852
	/* Try reading with an 8-bit addr len to discover actual addr len */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   853
	e100_eeprom_read(nic, &addr_len, 0);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   854
	nic->eeprom_wc = 1 << addr_len;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   855
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   856
	if (start + count >= nic->eeprom_wc)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   857
		return -EINVAL;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   858
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   859
	for (addr = start; addr < start + count; addr++)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   860
		e100_eeprom_write(nic, addr_len, addr, nic->eeprom[addr]);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   861
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   862
	/* The checksum, stored in the last word, is calculated such that
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   863
	 * the sum of words should be 0xBABA */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   864
	for (addr = 0; addr < nic->eeprom_wc - 1; addr++)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   865
		checksum += le16_to_cpu(nic->eeprom[addr]);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   866
	nic->eeprom[nic->eeprom_wc - 1] = cpu_to_le16(0xBABA - checksum);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   867
	e100_eeprom_write(nic, addr_len, nic->eeprom_wc - 1,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   868
		nic->eeprom[nic->eeprom_wc - 1]);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   869
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   870
	return 0;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   871
}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   872
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   873
#define E100_WAIT_SCB_TIMEOUT 20000 /* we might have to wait 100ms!!! */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   874
#define E100_WAIT_SCB_FAST 20       /* delay like the old code */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   875
static int e100_exec_cmd(struct nic *nic, u8 cmd, dma_addr_t dma_addr)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   876
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   877
	unsigned long flags = 0;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   878
	unsigned int i;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   879
	int err = 0;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   880
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   881
	if (!nic->ecdev)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   882
		spin_lock_irqsave(&nic->cmd_lock, flags);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   883
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   884
	/* Previous command is accepted when SCB clears */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   885
	for (i = 0; i < E100_WAIT_SCB_TIMEOUT; i++) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   886
		if (likely(!ioread8(&nic->csr->scb.cmd_lo)))
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   887
			break;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   888
		cpu_relax();
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   889
		if (unlikely(i > E100_WAIT_SCB_FAST))
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   890
			udelay(5);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   891
	}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   892
	if (unlikely(i == E100_WAIT_SCB_TIMEOUT)) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   893
		err = -EAGAIN;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   894
		goto err_unlock;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   895
	}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   896
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   897
	if (unlikely(cmd != cuc_resume))
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   898
		iowrite32(dma_addr, &nic->csr->scb.gen_ptr);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   899
	iowrite8(cmd, &nic->csr->scb.cmd_lo);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   900
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   901
err_unlock:
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   902
	if (!nic->ecdev)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   903
		spin_unlock_irqrestore(&nic->cmd_lock, flags);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   904
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   905
	return err;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   906
}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   907
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   908
static int e100_exec_cb(struct nic *nic, struct sk_buff *skb,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   909
	void (*cb_prepare)(struct nic *, struct cb *, struct sk_buff *))
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   910
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   911
	struct cb *cb;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   912
	unsigned long flags = 0;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   913
	int err = 0;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   914
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   915
	if (!nic->ecdev)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   916
		spin_lock_irqsave(&nic->cb_lock, flags);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   917
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   918
	if (unlikely(!nic->cbs_avail)) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   919
		err = -ENOMEM;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   920
		goto err_unlock;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   921
	}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   922
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   923
	cb = nic->cb_to_use;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   924
	nic->cb_to_use = cb->next;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   925
	nic->cbs_avail--;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   926
	cb->skb = skb;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   927
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   928
	if (unlikely(!nic->cbs_avail))
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   929
		err = -ENOSPC;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   930
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   931
	cb_prepare(nic, cb, skb);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   932
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   933
	/* Order is important otherwise we'll be in a race with h/w:
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   934
	 * set S-bit in current first, then clear S-bit in previous. */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   935
	cb->command |= cpu_to_le16(cb_s);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   936
	wmb();
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   937
	cb->prev->command &= cpu_to_le16(~cb_s);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   938
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   939
	while (nic->cb_to_send != nic->cb_to_use) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   940
		if (unlikely(e100_exec_cmd(nic, nic->cuc_cmd,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   941
			nic->cb_to_send->dma_addr))) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   942
			/* Ok, here's where things get sticky.  It's
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   943
			 * possible that we can't schedule the command
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   944
			 * because the controller is too busy, so
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   945
			 * let's just queue the command and try again
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   946
			 * when another command is scheduled. */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   947
			if (err == -ENOSPC) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   948
				//request a reset
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   949
				schedule_work(&nic->tx_timeout_task);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   950
			}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   951
			break;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   952
		} else {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   953
			nic->cuc_cmd = cuc_resume;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   954
			nic->cb_to_send = nic->cb_to_send->next;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   955
		}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   956
	}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   957
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   958
err_unlock:
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   959
	if (!nic->ecdev)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   960
		spin_unlock_irqrestore(&nic->cb_lock, flags);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   961
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   962
	return err;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   963
}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   964
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   965
static u16 mdio_ctrl(struct nic *nic, u32 addr, u32 dir, u32 reg, u16 data)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   966
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   967
	u32 data_out = 0;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   968
	unsigned int i;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   969
	unsigned long flags = 0;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   970
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   971
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   972
	/*
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   973
	 * Stratus87247: we shouldn't be writing the MDI control
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   974
	 * register until the Ready bit shows True.  Also, since
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   975
	 * manipulation of the MDI control registers is a multi-step
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   976
	 * procedure it should be done under lock.
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   977
	 */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   978
	if (!nic->ecdev)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   979
		spin_lock_irqsave(&nic->mdio_lock, flags);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   980
	for (i = 100; i; --i) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   981
		if (ioread32(&nic->csr->mdi_ctrl) & mdi_ready)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   982
			break;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   983
		udelay(20);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   984
	}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   985
	if (unlikely(!i)) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   986
		printk("e100.mdio_ctrl(%s) won't go Ready\n",
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   987
			nic->netdev->name );
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   988
		if (!nic->ecdev)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   989
			spin_unlock_irqrestore(&nic->mdio_lock, flags);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   990
		return 0;		/* No way to indicate timeout error */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   991
	}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   992
	iowrite32((reg << 16) | (addr << 21) | dir | data, &nic->csr->mdi_ctrl);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   993
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   994
	for (i = 0; i < 100; i++) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   995
		udelay(20);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   996
		if ((data_out = ioread32(&nic->csr->mdi_ctrl)) & mdi_ready)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   997
			break;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   998
	}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   999
	if (!nic->ecdev)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1000
		spin_unlock_irqrestore(&nic->mdio_lock, flags);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1001
	DPRINTK(HW, DEBUG,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1002
		"%s:addr=%d, reg=%d, data_in=0x%04X, data_out=0x%04X\n",
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1003
		dir == mdi_read ? "READ" : "WRITE", addr, reg, data, data_out);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1004
	return (u16)data_out;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1005
}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1006
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1007
static int mdio_read(struct net_device *netdev, int addr, int reg)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1008
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1009
	return mdio_ctrl(netdev_priv(netdev), addr, mdi_read, reg, 0);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1010
}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1011
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1012
static void mdio_write(struct net_device *netdev, int addr, int reg, int data)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1013
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1014
	mdio_ctrl(netdev_priv(netdev), addr, mdi_write, reg, data);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1015
}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1016
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1017
static void e100_get_defaults(struct nic *nic)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1018
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1019
	struct param_range rfds = { .min = 16, .max = 256, .count = 256 };
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1020
	struct param_range cbs  = { .min = 64, .max = 256, .count = 128 };
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1021
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1022
	/* MAC type is encoded as rev ID; exception: ICH is treated as 82559 */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1023
	nic->mac = (nic->flags & ich) ? mac_82559_D101M : nic->pdev->revision;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1024
	if (nic->mac == mac_unknown)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1025
		nic->mac = mac_82557_D100_A;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1026
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1027
	nic->params.rfds = rfds;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1028
	nic->params.cbs = cbs;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1029
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1030
	/* Quadwords to DMA into FIFO before starting frame transmit */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1031
	nic->tx_threshold = 0xE0;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1032
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1033
	/* no interrupt for every tx completion, delay = 256us if not 557 */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1034
	nic->tx_command = cpu_to_le16(cb_tx | cb_tx_sf |
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1035
		((nic->mac >= mac_82558_D101_A4) ? cb_cid : cb_i));
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1036
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1037
	/* Template for a freshly allocated RFD */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1038
	nic->blank_rfd.command = 0;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1039
	nic->blank_rfd.rbd = cpu_to_le32(0xFFFFFFFF);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1040
	nic->blank_rfd.size = cpu_to_le16(VLAN_ETH_FRAME_LEN);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1041
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1042
	/* MII setup */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1043
	nic->mii.phy_id_mask = 0x1F;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1044
	nic->mii.reg_num_mask = 0x1F;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1045
	nic->mii.dev = nic->netdev;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1046
	nic->mii.mdio_read = mdio_read;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1047
	nic->mii.mdio_write = mdio_write;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1048
}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1049
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1050
static void e100_configure(struct nic *nic, struct cb *cb, struct sk_buff *skb)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1051
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1052
	struct config *config = &cb->u.config;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1053
	u8 *c = (u8 *)config;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1054
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1055
	cb->command = cpu_to_le16(cb_config);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1056
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1057
	memset(config, 0, sizeof(struct config));
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1058
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1059
	config->byte_count = 0x16;		/* bytes in this struct */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1060
	config->rx_fifo_limit = 0x8;		/* bytes in FIFO before DMA */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1061
	config->direct_rx_dma = 0x1;		/* reserved */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1062
	config->standard_tcb = 0x1;		/* 1=standard, 0=extended */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1063
	config->standard_stat_counter = 0x1;	/* 1=standard, 0=extended */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1064
	config->rx_discard_short_frames = 0x1;	/* 1=discard, 0=pass */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1065
	config->tx_underrun_retry = 0x3;	/* # of underrun retries */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1066
	config->mii_mode = 0x1;			/* 1=MII mode, 0=503 mode */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1067
	config->pad10 = 0x6;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1068
	config->no_source_addr_insertion = 0x1;	/* 1=no, 0=yes */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1069
	config->preamble_length = 0x2;		/* 0=1, 1=3, 2=7, 3=15 bytes */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1070
	config->ifs = 0x6;			/* x16 = inter frame spacing */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1071
	config->ip_addr_hi = 0xF2;		/* ARP IP filter - not used */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1072
	config->pad15_1 = 0x1;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1073
	config->pad15_2 = 0x1;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1074
	config->crs_or_cdt = 0x0;		/* 0=CRS only, 1=CRS or CDT */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1075
	config->fc_delay_hi = 0x40;		/* time delay for fc frame */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1076
	config->tx_padding = 0x1;		/* 1=pad short frames */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1077
	config->fc_priority_threshold = 0x7;	/* 7=priority fc disabled */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1078
	config->pad18 = 0x1;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1079
	config->full_duplex_pin = 0x1;		/* 1=examine FDX# pin */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1080
	config->pad20_1 = 0x1F;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1081
	config->fc_priority_location = 0x1;	/* 1=byte#31, 0=byte#19 */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1082
	config->pad21_1 = 0x5;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1083
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1084
	config->adaptive_ifs = nic->adaptive_ifs;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1085
	config->loopback = nic->loopback;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1086
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1087
	if (nic->mii.force_media && nic->mii.full_duplex)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1088
		config->full_duplex_force = 0x1;	/* 1=force, 0=auto */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1089
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1090
	if (nic->flags & promiscuous || nic->loopback) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1091
		config->rx_save_bad_frames = 0x1;	/* 1=save, 0=discard */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1092
		config->rx_discard_short_frames = 0x0;	/* 1=discard, 0=save */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1093
		config->promiscuous_mode = 0x1;		/* 1=on, 0=off */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1094
	}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1095
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1096
	if (nic->flags & multicast_all)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1097
		config->multicast_all = 0x1;		/* 1=accept, 0=no */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1098
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1099
	/* disable WoL when up */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1100
	if (nic->ecdev || 
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1101
			(netif_running(nic->netdev) || !(nic->flags & wol_magic)))
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1102
		config->magic_packet_disable = 0x1;	/* 1=off, 0=on */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1103
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1104
	if (nic->mac >= mac_82558_D101_A4) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1105
		config->fc_disable = 0x1;	/* 1=Tx fc off, 0=Tx fc on */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1106
		config->mwi_enable = 0x1;	/* 1=enable, 0=disable */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1107
		config->standard_tcb = 0x0;	/* 1=standard, 0=extended */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1108
		config->rx_long_ok = 0x1;	/* 1=VLANs ok, 0=standard */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1109
		if (nic->mac >= mac_82559_D101M) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1110
			config->tno_intr = 0x1;		/* TCO stats enable */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1111
			/* Enable TCO in extended config */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1112
			if (nic->mac >= mac_82551_10) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1113
				config->byte_count = 0x20; /* extended bytes */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1114
				config->rx_d102_mode = 0x1; /* GMRC for TCO */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1115
			}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1116
		} else {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1117
			config->standard_stat_counter = 0x0;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1118
		}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1119
	}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1120
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1121
	DPRINTK(HW, DEBUG, "[00-07]=%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X\n",
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1122
		c[0], c[1], c[2], c[3], c[4], c[5], c[6], c[7]);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1123
	DPRINTK(HW, DEBUG, "[08-15]=%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X\n",
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1124
		c[8], c[9], c[10], c[11], c[12], c[13], c[14], c[15]);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1125
	DPRINTK(HW, DEBUG, "[16-23]=%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X\n",
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1126
		c[16], c[17], c[18], c[19], c[20], c[21], c[22], c[23]);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1127
}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1128
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1129
/*************************************************************************
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1130
*  CPUSaver parameters
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1131
*
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1132
*  All CPUSaver parameters are 16-bit literals that are part of a
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1133
*  "move immediate value" instruction.  By changing the value of
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1134
*  the literal in the instruction before the code is loaded, the
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1135
*  driver can change the algorithm.
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1136
*
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1137
*  INTDELAY - This loads the dead-man timer with its initial value.
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1138
*    When this timer expires the interrupt is asserted, and the
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1139
*    timer is reset each time a new packet is received.  (see
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1140
*    BUNDLEMAX below to set the limit on number of chained packets)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1141
*    The current default is 0x600 or 1536.  Experiments show that
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1142
*    the value should probably stay within the 0x200 - 0x1000.
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1143
*
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1144
*  BUNDLEMAX -
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1145
*    This sets the maximum number of frames that will be bundled.  In
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1146
*    some situations, such as the TCP windowing algorithm, it may be
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1147
*    better to limit the growth of the bundle size than let it go as
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1148
*    high as it can, because that could cause too much added latency.
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1149
*    The default is six, because this is the number of packets in the
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1150
*    default TCP window size.  A value of 1 would make CPUSaver indicate
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1151
*    an interrupt for every frame received.  If you do not want to put
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1152
*    a limit on the bundle size, set this value to xFFFF.
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1153
*
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1154
*  BUNDLESMALL -
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1155
*    This contains a bit-mask describing the minimum size frame that
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1156
*    will be bundled.  The default masks the lower 7 bits, which means
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1157
*    that any frame less than 128 bytes in length will not be bundled,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1158
*    but will instead immediately generate an interrupt.  This does
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1159
*    not affect the current bundle in any way.  Any frame that is 128
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1160
*    bytes or large will be bundled normally.  This feature is meant
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1161
*    to provide immediate indication of ACK frames in a TCP environment.
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1162
*    Customers were seeing poor performance when a machine with CPUSaver
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1163
*    enabled was sending but not receiving.  The delay introduced when
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1164
*    the ACKs were received was enough to reduce total throughput, because
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1165
*    the sender would sit idle until the ACK was finally seen.
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1166
*
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1167
*    The current default is 0xFF80, which masks out the lower 7 bits.
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1168
*    This means that any frame which is x7F (127) bytes or smaller
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1169
*    will cause an immediate interrupt.  Because this value must be a
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1170
*    bit mask, there are only a few valid values that can be used.  To
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1171
*    turn this feature off, the driver can write the value xFFFF to the
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1172
*    lower word of this instruction (in the same way that the other
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1173
*    parameters are used).  Likewise, a value of 0xF800 (2047) would
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1174
*    cause an interrupt to be generated for every frame, because all
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1175
*    standard Ethernet frames are <= 2047 bytes in length.
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1176
*************************************************************************/
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1177
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1178
/* if you wish to disable the ucode functionality, while maintaining the
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1179
 * workarounds it provides, set the following defines to:
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1180
 * BUNDLESMALL 0
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1181
 * BUNDLEMAX 1
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1182
 * INTDELAY 1
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1183
 */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1184
#define BUNDLESMALL 1
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1185
#define BUNDLEMAX (u16)6
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1186
#define INTDELAY (u16)1536 /* 0x600 */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1187
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1188
/* Initialize firmware */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1189
static const struct firmware *e100_request_firmware(struct nic *nic)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1190
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1191
	const char *fw_name;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1192
	const struct firmware *fw;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1193
	u8 timer, bundle, min_size;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1194
	int err;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1195
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1196
	/* do not load u-code for ICH devices */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1197
	if (nic->flags & ich)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1198
		return NULL;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1199
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1200
	/* Search for ucode match against h/w revision */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1201
	if (nic->mac == mac_82559_D101M)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1202
		fw_name = FIRMWARE_D101M;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1203
	else if (nic->mac == mac_82559_D101S)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1204
		fw_name = FIRMWARE_D101S;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1205
	else if (nic->mac == mac_82551_F || nic->mac == mac_82551_10)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1206
		fw_name = FIRMWARE_D102E;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1207
	else /* No ucode on other devices */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1208
		return NULL;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1209
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1210
	err = request_firmware(&fw, fw_name, &nic->pdev->dev);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1211
	if (err) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1212
		DPRINTK(PROBE, ERR, "Failed to load firmware \"%s\": %d\n",
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1213
			fw_name, err);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1214
		return ERR_PTR(err);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1215
	}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1216
	/* Firmware should be precisely UCODE_SIZE (words) plus three bytes
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1217
	   indicating the offsets for BUNDLESMALL, BUNDLEMAX, INTDELAY */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1218
	if (fw->size != UCODE_SIZE * 4 + 3) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1219
		DPRINTK(PROBE, ERR, "Firmware \"%s\" has wrong size %zu\n",
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1220
			fw_name, fw->size);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1221
		release_firmware(fw);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1222
		return ERR_PTR(-EINVAL);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1223
	}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1224
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1225
	/* Read timer, bundle and min_size from end of firmware blob */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1226
	timer = fw->data[UCODE_SIZE * 4];
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1227
	bundle = fw->data[UCODE_SIZE * 4 + 1];
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1228
	min_size = fw->data[UCODE_SIZE * 4 + 2];
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1229
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1230
	if (timer >= UCODE_SIZE || bundle >= UCODE_SIZE ||
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1231
	    min_size >= UCODE_SIZE) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1232
		DPRINTK(PROBE, ERR,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1233
			"\"%s\" has bogus offset values (0x%x,0x%x,0x%x)\n",
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1234
			fw_name, timer, bundle, min_size);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1235
		release_firmware(fw);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1236
		return ERR_PTR(-EINVAL);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1237
	}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1238
	/* OK, firmware is validated and ready to use... */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1239
	return fw;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1240
}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1241
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1242
static void e100_setup_ucode(struct nic *nic, struct cb *cb,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1243
			     struct sk_buff *skb)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1244
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1245
	const struct firmware *fw = (void *)skb;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1246
	u8 timer, bundle, min_size;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1247
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1248
	/* It's not a real skb; we just abused the fact that e100_exec_cb
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1249
	   will pass it through to here... */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1250
	cb->skb = NULL;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1251
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1252
	/* firmware is stored as little endian already */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1253
	memcpy(cb->u.ucode, fw->data, UCODE_SIZE * 4);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1254
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1255
	/* Read timer, bundle and min_size from end of firmware blob */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1256
	timer = fw->data[UCODE_SIZE * 4];
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1257
	bundle = fw->data[UCODE_SIZE * 4 + 1];
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1258
	min_size = fw->data[UCODE_SIZE * 4 + 2];
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1259
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1260
	/* Insert user-tunable settings in cb->u.ucode */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1261
	cb->u.ucode[timer] &= cpu_to_le32(0xFFFF0000);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1262
	cb->u.ucode[timer] |= cpu_to_le32(INTDELAY);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1263
	cb->u.ucode[bundle] &= cpu_to_le32(0xFFFF0000);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1264
	cb->u.ucode[bundle] |= cpu_to_le32(BUNDLEMAX);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1265
	cb->u.ucode[min_size] &= cpu_to_le32(0xFFFF0000);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1266
	cb->u.ucode[min_size] |= cpu_to_le32((BUNDLESMALL) ? 0xFFFF : 0xFF80);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1267
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1268
	cb->command = cpu_to_le16(cb_ucode | cb_el);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1269
}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1270
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1271
static inline int e100_load_ucode_wait(struct nic *nic)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1272
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1273
	const struct firmware *fw;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1274
	int err = 0, counter = 50;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1275
	struct cb *cb = nic->cb_to_clean;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1276
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1277
	fw = e100_request_firmware(nic);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1278
	/* If it's NULL, then no ucode is required */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1279
	if (!fw || IS_ERR(fw))
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1280
		return PTR_ERR(fw);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1281
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1282
	if ((err = e100_exec_cb(nic, (void *)fw, e100_setup_ucode)))
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1283
		DPRINTK(PROBE,ERR, "ucode cmd failed with error %d\n", err);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1284
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1285
	/* must restart cuc */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1286
	nic->cuc_cmd = cuc_start;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1287
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1288
	/* wait for completion */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1289
	e100_write_flush(nic);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1290
	udelay(10);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1291
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1292
	/* wait for possibly (ouch) 500ms */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1293
	while (!(cb->status & cpu_to_le16(cb_complete))) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1294
		msleep(10);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1295
		if (!--counter) break;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1296
	}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1297
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1298
	/* ack any interrupts, something could have been set */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1299
	iowrite8(~0, &nic->csr->scb.stat_ack);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1300
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1301
	/* if the command failed, or is not OK, notify and return */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1302
	if (!counter || !(cb->status & cpu_to_le16(cb_ok))) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1303
		DPRINTK(PROBE,ERR, "ucode load failed\n");
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1304
		err = -EPERM;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1305
	}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1306
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1307
	return err;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1308
}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1309
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1310
static void e100_setup_iaaddr(struct nic *nic, struct cb *cb,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1311
	struct sk_buff *skb)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1312
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1313
	cb->command = cpu_to_le16(cb_iaaddr);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1314
	memcpy(cb->u.iaaddr, nic->netdev->dev_addr, ETH_ALEN);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1315
}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1316
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1317
static void e100_dump(struct nic *nic, struct cb *cb, struct sk_buff *skb)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1318
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1319
	cb->command = cpu_to_le16(cb_dump);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1320
	cb->u.dump_buffer_addr = cpu_to_le32(nic->dma_addr +
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1321
		offsetof(struct mem, dump_buf));
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1322
}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1323
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1324
#define NCONFIG_AUTO_SWITCH	0x0080
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1325
#define MII_NSC_CONG		MII_RESV1
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1326
#define NSC_CONG_ENABLE		0x0100
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1327
#define NSC_CONG_TXREADY	0x0400
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1328
#define ADVERTISE_FC_SUPPORTED	0x0400
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1329
static int e100_phy_init(struct nic *nic)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1330
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1331
	struct net_device *netdev = nic->netdev;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1332
	u32 addr;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1333
	u16 bmcr, stat, id_lo, id_hi, cong;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1334
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1335
	/* Discover phy addr by searching addrs in order {1,0,2,..., 31} */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1336
	for (addr = 0; addr < 32; addr++) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1337
		nic->mii.phy_id = (addr == 0) ? 1 : (addr == 1) ? 0 : addr;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1338
		bmcr = mdio_read(netdev, nic->mii.phy_id, MII_BMCR);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1339
		stat = mdio_read(netdev, nic->mii.phy_id, MII_BMSR);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1340
		stat = mdio_read(netdev, nic->mii.phy_id, MII_BMSR);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1341
		if (!((bmcr == 0xFFFF) || ((stat == 0) && (bmcr == 0))))
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1342
			break;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1343
	}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1344
	DPRINTK(HW, DEBUG, "phy_addr = %d\n", nic->mii.phy_id);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1345
	if (addr == 32)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1346
		return -EAGAIN;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1347
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1348
	/* Selected the phy and isolate the rest */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1349
	for (addr = 0; addr < 32; addr++) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1350
		if (addr != nic->mii.phy_id) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1351
			mdio_write(netdev, addr, MII_BMCR, BMCR_ISOLATE);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1352
		} else {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1353
			bmcr = mdio_read(netdev, addr, MII_BMCR);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1354
			mdio_write(netdev, addr, MII_BMCR,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1355
				bmcr & ~BMCR_ISOLATE);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1356
		}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1357
	}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1358
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1359
	/* Get phy ID */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1360
	id_lo = mdio_read(netdev, nic->mii.phy_id, MII_PHYSID1);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1361
	id_hi = mdio_read(netdev, nic->mii.phy_id, MII_PHYSID2);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1362
	nic->phy = (u32)id_hi << 16 | (u32)id_lo;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1363
	DPRINTK(HW, DEBUG, "phy ID = 0x%08X\n", nic->phy);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1364
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1365
	/* Handle National tx phys */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1366
#define NCS_PHY_MODEL_MASK	0xFFF0FFFF
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1367
	if ((nic->phy & NCS_PHY_MODEL_MASK) == phy_nsc_tx) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1368
		/* Disable congestion control */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1369
		cong = mdio_read(netdev, nic->mii.phy_id, MII_NSC_CONG);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1370
		cong |= NSC_CONG_TXREADY;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1371
		cong &= ~NSC_CONG_ENABLE;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1372
		mdio_write(netdev, nic->mii.phy_id, MII_NSC_CONG, cong);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1373
	}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1374
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1375
	if ((nic->mac >= mac_82550_D102) || ((nic->flags & ich) &&
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1376
	   (mdio_read(netdev, nic->mii.phy_id, MII_TPISTATUS) & 0x8000) &&
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1377
		!(nic->eeprom[eeprom_cnfg_mdix] & eeprom_mdix_enabled))) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1378
		/* enable/disable MDI/MDI-X auto-switching. */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1379
		mdio_write(netdev, nic->mii.phy_id, MII_NCONFIG,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1380
				nic->mii.force_media ? 0 : NCONFIG_AUTO_SWITCH);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1381
	}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1382
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1383
	return 0;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1384
}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1385
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1386
static int e100_hw_init(struct nic *nic)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1387
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1388
	int err;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1389
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1390
	e100_hw_reset(nic);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1391
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1392
	DPRINTK(HW, ERR, "e100_hw_init\n");
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1393
	if (!in_interrupt() && (err = e100_self_test(nic)))
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1394
		return err;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1395
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1396
	if ((err = e100_phy_init(nic)))
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1397
		return err;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1398
	if ((err = e100_exec_cmd(nic, cuc_load_base, 0)))
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1399
		return err;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1400
	if ((err = e100_exec_cmd(nic, ruc_load_base, 0)))
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1401
		return err;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1402
	if ((err = e100_load_ucode_wait(nic)))
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1403
		return err;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1404
	if ((err = e100_exec_cb(nic, NULL, e100_configure)))
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1405
		return err;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1406
	if ((err = e100_exec_cb(nic, NULL, e100_setup_iaaddr)))
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1407
		return err;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1408
	if ((err = e100_exec_cmd(nic, cuc_dump_addr,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1409
		nic->dma_addr + offsetof(struct mem, stats))))
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1410
		return err;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1411
	if ((err = e100_exec_cmd(nic, cuc_dump_reset, 0)))
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1412
		return err;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1413
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1414
	e100_disable_irq(nic);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1415
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1416
	return 0;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1417
}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1418
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1419
static void e100_multi(struct nic *nic, struct cb *cb, struct sk_buff *skb)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1420
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1421
	struct net_device *netdev = nic->netdev;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1422
	struct dev_mc_list *list = netdev->mc_list;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1423
	u16 i, count = min(netdev->mc_count, E100_MAX_MULTICAST_ADDRS);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1424
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1425
	cb->command = cpu_to_le16(cb_multi);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1426
	cb->u.multi.count = cpu_to_le16(count * ETH_ALEN);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1427
	for (i = 0; list && i < count; i++, list = list->next)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1428
		memcpy(&cb->u.multi.addr[i*ETH_ALEN], &list->dmi_addr,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1429
			ETH_ALEN);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1430
}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1431
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1432
static void e100_set_multicast_list(struct net_device *netdev)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1433
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1434
	struct nic *nic = netdev_priv(netdev);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1435
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1436
	DPRINTK(HW, DEBUG, "mc_count=%d, flags=0x%04X\n",
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1437
		netdev->mc_count, netdev->flags);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1438
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1439
	if (netdev->flags & IFF_PROMISC)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1440
		nic->flags |= promiscuous;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1441
	else
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1442
		nic->flags &= ~promiscuous;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1443
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1444
	if (netdev->flags & IFF_ALLMULTI ||
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1445
		netdev->mc_count > E100_MAX_MULTICAST_ADDRS)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1446
		nic->flags |= multicast_all;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1447
	else
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1448
		nic->flags &= ~multicast_all;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1449
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1450
	e100_exec_cb(nic, NULL, e100_configure);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1451
	e100_exec_cb(nic, NULL, e100_multi);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1452
}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1453
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1454
static void e100_update_stats(struct nic *nic)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1455
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1456
	struct net_device *dev = nic->netdev;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1457
	struct net_device_stats *ns = &dev->stats;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1458
	struct stats *s = &nic->mem->stats;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1459
	__le32 *complete = (nic->mac < mac_82558_D101_A4) ? &s->fc_xmt_pause :
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1460
		(nic->mac < mac_82559_D101M) ? (__le32 *)&s->xmt_tco_frames :
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1461
		&s->complete;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1462
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1463
	/* Device's stats reporting may take several microseconds to
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1464
	 * complete, so we're always waiting for results of the
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1465
	 * previous command. */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1466
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1467
	if (*complete == cpu_to_le32(cuc_dump_reset_complete)) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1468
		*complete = 0;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1469
		nic->tx_frames = le32_to_cpu(s->tx_good_frames);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1470
		nic->tx_collisions = le32_to_cpu(s->tx_total_collisions);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1471
		ns->tx_aborted_errors += le32_to_cpu(s->tx_max_collisions);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1472
		ns->tx_window_errors += le32_to_cpu(s->tx_late_collisions);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1473
		ns->tx_carrier_errors += le32_to_cpu(s->tx_lost_crs);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1474
		ns->tx_fifo_errors += le32_to_cpu(s->tx_underruns);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1475
		ns->collisions += nic->tx_collisions;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1476
		ns->tx_errors += le32_to_cpu(s->tx_max_collisions) +
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1477
			le32_to_cpu(s->tx_lost_crs);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1478
		ns->rx_length_errors += le32_to_cpu(s->rx_short_frame_errors) +
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1479
			nic->rx_over_length_errors;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1480
		ns->rx_crc_errors += le32_to_cpu(s->rx_crc_errors);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1481
		ns->rx_frame_errors += le32_to_cpu(s->rx_alignment_errors);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1482
		ns->rx_over_errors += le32_to_cpu(s->rx_overrun_errors);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1483
		ns->rx_fifo_errors += le32_to_cpu(s->rx_overrun_errors);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1484
		ns->rx_missed_errors += le32_to_cpu(s->rx_resource_errors);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1485
		ns->rx_errors += le32_to_cpu(s->rx_crc_errors) +
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1486
			le32_to_cpu(s->rx_alignment_errors) +
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1487
			le32_to_cpu(s->rx_short_frame_errors) +
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1488
			le32_to_cpu(s->rx_cdt_errors);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1489
		nic->tx_deferred += le32_to_cpu(s->tx_deferred);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1490
		nic->tx_single_collisions +=
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1491
			le32_to_cpu(s->tx_single_collisions);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1492
		nic->tx_multiple_collisions +=
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1493
			le32_to_cpu(s->tx_multiple_collisions);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1494
		if (nic->mac >= mac_82558_D101_A4) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1495
			nic->tx_fc_pause += le32_to_cpu(s->fc_xmt_pause);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1496
			nic->rx_fc_pause += le32_to_cpu(s->fc_rcv_pause);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1497
			nic->rx_fc_unsupported +=
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1498
				le32_to_cpu(s->fc_rcv_unsupported);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1499
			if (nic->mac >= mac_82559_D101M) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1500
				nic->tx_tco_frames +=
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1501
					le16_to_cpu(s->xmt_tco_frames);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1502
				nic->rx_tco_frames +=
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1503
					le16_to_cpu(s->rcv_tco_frames);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1504
			}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1505
		}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1506
	}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1507
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1508
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1509
	if (e100_exec_cmd(nic, cuc_dump_reset, 0))
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1510
		DPRINTK(TX_ERR, DEBUG, "exec cuc_dump_reset failed\n");
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1511
}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1512
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1513
static void e100_adjust_adaptive_ifs(struct nic *nic, int speed, int duplex)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1514
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1515
	/* Adjust inter-frame-spacing (IFS) between two transmits if
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1516
	 * we're getting collisions on a half-duplex connection. */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1517
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1518
	if (duplex == DUPLEX_HALF) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1519
		u32 prev = nic->adaptive_ifs;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1520
		u32 min_frames = (speed == SPEED_100) ? 1000 : 100;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1521
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1522
		if ((nic->tx_frames / 32 < nic->tx_collisions) &&
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1523
		   (nic->tx_frames > min_frames)) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1524
			if (nic->adaptive_ifs < 60)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1525
				nic->adaptive_ifs += 5;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1526
		} else if (nic->tx_frames < min_frames) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1527
			if (nic->adaptive_ifs >= 5)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1528
				nic->adaptive_ifs -= 5;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1529
		}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1530
		if (nic->adaptive_ifs != prev)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1531
			e100_exec_cb(nic, NULL, e100_configure);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1532
	}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1533
}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1534
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1535
static void e100_watchdog(unsigned long data)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1536
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1537
	struct nic *nic = (struct nic *)data;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1538
	struct ethtool_cmd cmd;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1539
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1540
	DPRINTK(TIMER, DEBUG, "right now = %ld\n", jiffies);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1541
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1542
	/* mii library handles link maintenance tasks */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1543
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1544
    if (nic->ecdev) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1545
    	ecdev_set_link(nic->ecdev, mii_link_ok(&nic->mii) ? 1 : 0);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1546
	} else {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1547
		mii_ethtool_gset(&nic->mii, &cmd);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1548
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1549
		if (mii_link_ok(&nic->mii) && !netif_carrier_ok(nic->netdev)) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1550
			printk(KERN_INFO "e100: %s NIC Link is Up %s Mbps %s Duplex\n",
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1551
					nic->netdev->name,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1552
					cmd.speed == SPEED_100 ? "100" : "10",
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1553
					cmd.duplex == DUPLEX_FULL ? "Full" : "Half");
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1554
		} else if (!mii_link_ok(&nic->mii) && netif_carrier_ok(nic->netdev)) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1555
			printk(KERN_INFO "e100: %s NIC Link is Down\n",
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1556
					nic->netdev->name);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1557
		}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1558
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1559
		mii_check_link(&nic->mii);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1560
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1561
		/* Software generated interrupt to recover from (rare) Rx
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1562
		 * allocation failure.
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1563
		 * Unfortunately have to use a spinlock to not re-enable interrupts
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1564
		 * accidentally, due to hardware that shares a register between the
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1565
		 * interrupt mask bit and the SW Interrupt generation bit */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1566
		spin_lock_irq(&nic->cmd_lock);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1567
		iowrite8(ioread8(&nic->csr->scb.cmd_hi) | irq_sw_gen,&nic->csr->scb.cmd_hi);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1568
		e100_write_flush(nic);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1569
		spin_unlock_irq(&nic->cmd_lock);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1570
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1571
		e100_update_stats(nic);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1572
		e100_adjust_adaptive_ifs(nic, cmd.speed, cmd.duplex);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1573
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1574
		if (nic->mac <= mac_82557_D100_C)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1575
			/* Issue a multicast command to workaround a 557 lock up */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1576
			e100_set_multicast_list(nic->netdev);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1577
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1578
		if (nic->flags & ich && cmd.speed==SPEED_10 && cmd.duplex==DUPLEX_HALF)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1579
			/* Need SW workaround for ICH[x] 10Mbps/half duplex Tx hang. */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1580
			nic->flags |= ich_10h_workaround;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1581
		else
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1582
			nic->flags &= ~ich_10h_workaround;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1583
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1584
		mod_timer(&nic->watchdog,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1585
				round_jiffies(jiffies + E100_WATCHDOG_PERIOD));
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1586
	}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1587
}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1588
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1589
static void e100_xmit_prepare(struct nic *nic, struct cb *cb,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1590
	struct sk_buff *skb)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1591
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1592
	cb->command = nic->tx_command;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1593
	/* interrupt every 16 packets regardless of delay */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1594
	if ((nic->cbs_avail & ~15) == nic->cbs_avail)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1595
		cb->command |= cpu_to_le16(cb_i);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1596
	cb->u.tcb.tbd_array = cb->dma_addr + offsetof(struct cb, u.tcb.tbd);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1597
	cb->u.tcb.tcb_byte_count = 0;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1598
	cb->u.tcb.threshold = nic->tx_threshold;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1599
	cb->u.tcb.tbd_count = 1;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1600
	cb->u.tcb.tbd.buf_addr = cpu_to_le32(pci_map_single(nic->pdev,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1601
		skb->data, skb->len, PCI_DMA_TODEVICE));
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1602
	/* check for mapping failure? */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1603
	cb->u.tcb.tbd.size = cpu_to_le16(skb->len);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1604
}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1605
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1606
static int e100_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1607
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1608
	struct nic *nic = netdev_priv(netdev);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1609
	int err;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1610
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1611
	if (nic->flags & ich_10h_workaround) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1612
		/* SW workaround for ICH[x] 10Mbps/half duplex Tx hang.
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1613
		   Issue a NOP command followed by a 1us delay before
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1614
		   issuing the Tx command. */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1615
		if (e100_exec_cmd(nic, cuc_nop, 0))
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1616
			DPRINTK(TX_ERR, DEBUG, "exec cuc_nop failed\n");
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1617
		udelay(1);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1618
	}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1619
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1620
	err = e100_exec_cb(nic, skb, e100_xmit_prepare);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1621
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1622
	switch (err) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1623
	case -ENOSPC:
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1624
		/* We queued the skb, but now we're out of space. */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1625
		DPRINTK(TX_ERR, DEBUG, "No space for CB\n");
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1626
		if (!nic->ecdev)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1627
			netif_stop_queue(netdev);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1628
		break;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1629
	case -ENOMEM:
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1630
		/* This is a hard error - log it. */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1631
		DPRINTK(TX_ERR, DEBUG, "Out of Tx resources, returning skb\n");
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1632
		if (!nic->ecdev)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1633
			netif_stop_queue(netdev);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1634
		return 1;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1635
	}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1636
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1637
	netdev->trans_start = jiffies;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1638
	return 0;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1639
}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1640
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1641
static int e100_tx_clean(struct nic *nic)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1642
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1643
	struct net_device *dev = nic->netdev;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1644
	struct cb *cb;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1645
	int tx_cleaned = 0;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1646
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1647
	if (!nic->ecdev)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1648
		spin_lock(&nic->cb_lock);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1649
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1650
	/* Clean CBs marked complete */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1651
	for (cb = nic->cb_to_clean;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1652
	    cb->status & cpu_to_le16(cb_complete);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1653
	    cb = nic->cb_to_clean = cb->next) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1654
		DPRINTK(TX_DONE, DEBUG, "cb[%d]->status = 0x%04X\n",
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1655
		        (int)(((void*)cb - (void*)nic->cbs)/sizeof(struct cb)),
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1656
		        cb->status);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1657
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1658
		if (likely(cb->skb != NULL)) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1659
			dev->stats.tx_packets++;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1660
			dev->stats.tx_bytes += cb->skb->len;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1661
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1662
			pci_unmap_single(nic->pdev,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1663
				le32_to_cpu(cb->u.tcb.tbd.buf_addr),
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1664
				le16_to_cpu(cb->u.tcb.tbd.size),
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1665
				PCI_DMA_TODEVICE);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1666
			if (!nic->ecdev)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1667
				dev_kfree_skb_any(cb->skb);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1668
			cb->skb = NULL;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1669
			tx_cleaned = 1;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1670
		}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1671
		cb->status = 0;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1672
		nic->cbs_avail++;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1673
	}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1674
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1675
	if (!nic->ecdev) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1676
		spin_unlock(&nic->cb_lock);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1677
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1678
		/* Recover from running out of Tx resources in xmit_frame */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1679
		if (unlikely(tx_cleaned && netif_queue_stopped(nic->netdev)))
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1680
			netif_wake_queue(nic->netdev);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1681
	}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1682
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1683
	return tx_cleaned;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1684
}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1685
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1686
static void e100_clean_cbs(struct nic *nic)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1687
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1688
	if (nic->cbs) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1689
		while (nic->cbs_avail != nic->params.cbs.count) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1690
			struct cb *cb = nic->cb_to_clean;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1691
			if (cb->skb) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1692
				pci_unmap_single(nic->pdev,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1693
					le32_to_cpu(cb->u.tcb.tbd.buf_addr),
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1694
					le16_to_cpu(cb->u.tcb.tbd.size),
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1695
					PCI_DMA_TODEVICE);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1696
				if (!nic->ecdev)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1697
					dev_kfree_skb(cb->skb);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1698
			}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1699
			nic->cb_to_clean = nic->cb_to_clean->next;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1700
			nic->cbs_avail++;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1701
		}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1702
		pci_free_consistent(nic->pdev,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1703
			sizeof(struct cb) * nic->params.cbs.count,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1704
			nic->cbs, nic->cbs_dma_addr);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1705
		nic->cbs = NULL;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1706
		nic->cbs_avail = 0;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1707
	}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1708
	nic->cuc_cmd = cuc_start;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1709
	nic->cb_to_use = nic->cb_to_send = nic->cb_to_clean =
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1710
		nic->cbs;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1711
}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1712
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1713
static int e100_alloc_cbs(struct nic *nic)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1714
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1715
	struct cb *cb;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1716
	unsigned int i, count = nic->params.cbs.count;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1717
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1718
	nic->cuc_cmd = cuc_start;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1719
	nic->cb_to_use = nic->cb_to_send = nic->cb_to_clean = NULL;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1720
	nic->cbs_avail = 0;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1721
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1722
	nic->cbs = pci_alloc_consistent(nic->pdev,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1723
		sizeof(struct cb) * count, &nic->cbs_dma_addr);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1724
	if (!nic->cbs)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1725
		return -ENOMEM;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1726
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1727
	for (cb = nic->cbs, i = 0; i < count; cb++, i++) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1728
		cb->next = (i + 1 < count) ? cb + 1 : nic->cbs;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1729
		cb->prev = (i == 0) ? nic->cbs + count - 1 : cb - 1;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1730
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1731
		cb->dma_addr = nic->cbs_dma_addr + i * sizeof(struct cb);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1732
		cb->link = cpu_to_le32(nic->cbs_dma_addr +
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1733
			((i+1) % count) * sizeof(struct cb));
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1734
		cb->skb = NULL;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1735
	}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1736
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1737
	nic->cb_to_use = nic->cb_to_send = nic->cb_to_clean = nic->cbs;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1738
	nic->cbs_avail = count;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1739
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1740
	return 0;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1741
}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1742
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1743
static inline void e100_start_receiver(struct nic *nic, struct rx *rx)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1744
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1745
	if (!nic->rxs) return;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1746
	if (RU_SUSPENDED != nic->ru_running) return;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1747
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1748
	/* handle init time starts */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1749
	if (!rx) rx = nic->rxs;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1750
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1751
	/* (Re)start RU if suspended or idle and RFA is non-NULL */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1752
	if (rx->skb) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1753
		e100_exec_cmd(nic, ruc_start, rx->dma_addr);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1754
		nic->ru_running = RU_RUNNING;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1755
	}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1756
}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1757
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1758
#define RFD_BUF_LEN (sizeof(struct rfd) + VLAN_ETH_FRAME_LEN)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1759
static int e100_rx_alloc_skb(struct nic *nic, struct rx *rx)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1760
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1761
	if (!(rx->skb = netdev_alloc_skb(nic->netdev, RFD_BUF_LEN + NET_IP_ALIGN)))
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1762
		return -ENOMEM;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1763
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1764
	/* Align, init, and map the RFD. */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1765
	skb_reserve(rx->skb, NET_IP_ALIGN);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1766
	skb_copy_to_linear_data(rx->skb, &nic->blank_rfd, sizeof(struct rfd));
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1767
	rx->dma_addr = pci_map_single(nic->pdev, rx->skb->data,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1768
		RFD_BUF_LEN, PCI_DMA_BIDIRECTIONAL);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1769
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1770
	if (pci_dma_mapping_error(nic->pdev, rx->dma_addr)) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1771
		dev_kfree_skb_any(rx->skb);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1772
		rx->skb = NULL;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1773
		rx->dma_addr = 0;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1774
		return -ENOMEM;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1775
	}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1776
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1777
	/* Link the RFD to end of RFA by linking previous RFD to
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1778
	 * this one.  We are safe to touch the previous RFD because
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1779
	 * it is protected by the before last buffer's el bit being set */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1780
	if (rx->prev->skb) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1781
		struct rfd *prev_rfd = (struct rfd *)rx->prev->skb->data;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1782
		put_unaligned_le32(rx->dma_addr, &prev_rfd->link);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1783
		pci_dma_sync_single_for_device(nic->pdev, rx->prev->dma_addr,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1784
			sizeof(struct rfd), PCI_DMA_BIDIRECTIONAL);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1785
	}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1786
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1787
	return 0;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1788
}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1789
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1790
static int e100_rx_indicate(struct nic *nic, struct rx *rx,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1791
	unsigned int *work_done, unsigned int work_to_do)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1792
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1793
	struct net_device *dev = nic->netdev;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1794
	struct sk_buff *skb = rx->skb;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1795
	struct rfd *rfd = (struct rfd *)skb->data;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1796
	u16 rfd_status, actual_size;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1797
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1798
	if (unlikely(work_done && *work_done >= work_to_do))
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1799
		return -EAGAIN;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1800
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1801
	/* Need to sync before taking a peek at cb_complete bit */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1802
	pci_dma_sync_single_for_cpu(nic->pdev, rx->dma_addr,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1803
		sizeof(struct rfd), PCI_DMA_BIDIRECTIONAL);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1804
	rfd_status = le16_to_cpu(rfd->status);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1805
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1806
	DPRINTK(RX_STATUS, DEBUG, "status=0x%04X\n", rfd_status);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1807
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1808
	/* If data isn't ready, nothing to indicate */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1809
	if (unlikely(!(rfd_status & cb_complete))) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1810
		/* If the next buffer has the el bit, but we think the receiver
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1811
		 * is still running, check to see if it really stopped while
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1812
		 * we had interrupts off.
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1813
		 * This allows for a fast restart without re-enabling
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1814
		 * interrupts */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1815
		if ((le16_to_cpu(rfd->command) & cb_el) &&
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1816
		    (RU_RUNNING == nic->ru_running))
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1817
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1818
			if (ioread8(&nic->csr->scb.status) & rus_no_res)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1819
				nic->ru_running = RU_SUSPENDED;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1820
		return -ENODATA;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1821
	}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1822
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1823
	/* Get actual data size */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1824
	actual_size = le16_to_cpu(rfd->actual_size) & 0x3FFF;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1825
	if (unlikely(actual_size > RFD_BUF_LEN - sizeof(struct rfd)))
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1826
		actual_size = RFD_BUF_LEN - sizeof(struct rfd);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1827
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1828
	/* Get data */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1829
	pci_unmap_single(nic->pdev, rx->dma_addr,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1830
		RFD_BUF_LEN, PCI_DMA_BIDIRECTIONAL);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1831
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1832
	/* If this buffer has the el bit, but we think the receiver
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1833
	 * is still running, check to see if it really stopped while
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1834
	 * we had interrupts off.
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1835
	 * This allows for a fast restart without re-enabling interrupts.
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1836
	 * This can happen when the RU sees the size change but also sees
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1837
	 * the el bit set. */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1838
	if ((le16_to_cpu(rfd->command) & cb_el) &&
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1839
	    (RU_RUNNING == nic->ru_running)) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1840
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1841
	    if (ioread8(&nic->csr->scb.status) & rus_no_res)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1842
		nic->ru_running = RU_SUSPENDED;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1843
	}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1844
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1845
	if (!nic->ecdev) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1846
		/* Pull off the RFD and put the actual data (minus eth hdr) */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1847
		skb_reserve(skb, sizeof(struct rfd));
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1848
		skb_put(skb, actual_size);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1849
		skb->protocol = eth_type_trans(skb, nic->netdev);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1850
	}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1851
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1852
	if (unlikely(!(rfd_status & cb_ok))) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1853
		if (!nic->ecdev) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1854
			/* Don't indicate if hardware indicates errors */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1855
			dev_kfree_skb_any(skb);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1856
		}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1857
	} else if (actual_size > ETH_DATA_LEN + VLAN_ETH_HLEN) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1858
		/* Don't indicate oversized frames */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1859
		nic->rx_over_length_errors++;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1860
		if (!nic->ecdev)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1861
			dev_kfree_skb_any(skb);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1862
	} else {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1863
		dev->stats.rx_packets++;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1864
		dev->stats.rx_bytes += actual_size;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1865
		if (nic->ecdev) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1866
			ecdev_receive(nic->ecdev,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1867
					skb->data + sizeof(struct rfd), actual_size);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1868
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1869
			// No need to detect link status as
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1870
			// long as frames are received: Reset watchdog.
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1871
			nic->ec_watchdog_jiffies = jiffies;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1872
		} else {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1873
			netif_receive_skb(skb);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1874
		}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1875
		if (work_done)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1876
			(*work_done)++;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1877
	}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1878
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1879
	if (nic->ecdev) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1880
		// make receive frame descriptior usable again
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1881
		memcpy(skb->data, &nic->blank_rfd, sizeof(struct rfd));
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1882
		rx->dma_addr = pci_map_single(nic->pdev, skb->data,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1883
				RFD_BUF_LEN, PCI_DMA_BIDIRECTIONAL);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1884
		if (pci_dma_mapping_error(nic->pdev, rx->dma_addr)) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1885
			rx->dma_addr = 0;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1886
		}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1887
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1888
		/* Link the RFD to end of RFA by linking previous RFD to
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1889
		 * this one.  We are safe to touch the previous RFD because
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1890
		 * it is protected by the before last buffer's el bit being set */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1891
		if (rx->prev->skb) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1892
			struct rfd *prev_rfd = (struct rfd *)rx->prev->skb->data;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1893
			put_unaligned_le32(rx->dma_addr, &prev_rfd->link);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1894
			pci_dma_sync_single_for_device(nic->pdev, rx->prev->dma_addr,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1895
					sizeof(struct rfd), PCI_DMA_TODEVICE);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1896
		}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1897
	} else {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1898
		rx->skb = NULL;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1899
	}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1900
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1901
	return 0;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1902
}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1903
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1904
static void e100_rx_clean(struct nic *nic, unsigned int *work_done,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1905
	unsigned int work_to_do)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1906
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1907
	struct rx *rx;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1908
	int restart_required = 0, err = 0;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1909
	struct rx *old_before_last_rx, *new_before_last_rx;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1910
	struct rfd *old_before_last_rfd, *new_before_last_rfd;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1911
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1912
	/* Indicate newly arrived packets */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1913
	for (rx = nic->rx_to_clean; rx->skb; rx = nic->rx_to_clean = rx->next) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1914
		err = e100_rx_indicate(nic, rx, work_done, work_to_do);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1915
		/* Hit quota or no more to clean */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1916
		if (-EAGAIN == err || -ENODATA == err)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1917
			break;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1918
	}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1919
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1920
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1921
	/* On EAGAIN, hit quota so have more work to do, restart once
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1922
	 * cleanup is complete.
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1923
	 * Else, are we already rnr? then pay attention!!! this ensures that
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1924
	 * the state machine progression never allows a start with a
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1925
	 * partially cleaned list, avoiding a race between hardware
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1926
	 * and rx_to_clean when in NAPI mode */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1927
	if (-EAGAIN != err && RU_SUSPENDED == nic->ru_running)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1928
		restart_required = 1;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1929
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1930
	old_before_last_rx = nic->rx_to_use->prev->prev;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1931
	old_before_last_rfd = (struct rfd *)old_before_last_rx->skb->data;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1932
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1933
	if (!nic->ecdev) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1934
		/* Alloc new skbs to refill list */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1935
		for(rx = nic->rx_to_use; !rx->skb; rx = nic->rx_to_use = rx->next) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1936
			if(unlikely(e100_rx_alloc_skb(nic, rx)))
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1937
				break; /* Better luck next time (see watchdog) */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1938
		}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1939
	}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1940
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1941
	new_before_last_rx = nic->rx_to_use->prev->prev;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1942
	if (new_before_last_rx != old_before_last_rx) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1943
		/* Set the el-bit on the buffer that is before the last buffer.
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1944
		 * This lets us update the next pointer on the last buffer
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1945
		 * without worrying about hardware touching it.
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1946
		 * We set the size to 0 to prevent hardware from touching this
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1947
		 * buffer.
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1948
		 * When the hardware hits the before last buffer with el-bit
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1949
		 * and size of 0, it will RNR interrupt, the RUS will go into
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1950
		 * the No Resources state.  It will not complete nor write to
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1951
		 * this buffer. */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1952
		new_before_last_rfd =
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1953
			(struct rfd *)new_before_last_rx->skb->data;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1954
		new_before_last_rfd->size = 0;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1955
		new_before_last_rfd->command |= cpu_to_le16(cb_el);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1956
		pci_dma_sync_single_for_device(nic->pdev,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1957
			new_before_last_rx->dma_addr, sizeof(struct rfd),
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1958
			PCI_DMA_BIDIRECTIONAL);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1959
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1960
		/* Now that we have a new stopping point, we can clear the old
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1961
		 * stopping point.  We must sync twice to get the proper
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1962
		 * ordering on the hardware side of things. */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1963
		old_before_last_rfd->command &= ~cpu_to_le16(cb_el);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1964
		pci_dma_sync_single_for_device(nic->pdev,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1965
			old_before_last_rx->dma_addr, sizeof(struct rfd),
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1966
			PCI_DMA_BIDIRECTIONAL);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1967
		old_before_last_rfd->size = cpu_to_le16(VLAN_ETH_FRAME_LEN);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1968
		pci_dma_sync_single_for_device(nic->pdev,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1969
			old_before_last_rx->dma_addr, sizeof(struct rfd),
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1970
			PCI_DMA_BIDIRECTIONAL);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1971
	}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1972
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1973
	if (restart_required) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1974
		// ack the rnr?
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1975
		iowrite8(stat_ack_rnr, &nic->csr->scb.stat_ack);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1976
		e100_start_receiver(nic, nic->rx_to_clean);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1977
		if (work_done)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1978
			(*work_done)++;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1979
	}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1980
}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1981
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1982
static void e100_rx_clean_list(struct nic *nic)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1983
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1984
	struct rx *rx;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1985
	unsigned int i, count = nic->params.rfds.count;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1986
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1987
	nic->ru_running = RU_UNINITIALIZED;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1988
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1989
	if (nic->rxs) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1990
		for (rx = nic->rxs, i = 0; i < count; rx++, i++) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1991
			if (rx->skb) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1992
				pci_unmap_single(nic->pdev, rx->dma_addr,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1993
					RFD_BUF_LEN, PCI_DMA_BIDIRECTIONAL);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1994
				dev_kfree_skb(rx->skb);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1995
			}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1996
		}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1997
		kfree(nic->rxs);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1998
		nic->rxs = NULL;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1999
	}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2000
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2001
	nic->rx_to_use = nic->rx_to_clean = NULL;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2002
}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2003
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2004
static int e100_rx_alloc_list(struct nic *nic)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2005
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2006
	struct rx *rx;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2007
	unsigned int i, count = nic->params.rfds.count;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2008
	struct rfd *before_last;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2009
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2010
	nic->rx_to_use = nic->rx_to_clean = NULL;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2011
	nic->ru_running = RU_UNINITIALIZED;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2012
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2013
	if (!(nic->rxs = kcalloc(count, sizeof(struct rx), GFP_ATOMIC)))
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2014
		return -ENOMEM;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2015
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2016
	for (rx = nic->rxs, i = 0; i < count; rx++, i++) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2017
		rx->next = (i + 1 < count) ? rx + 1 : nic->rxs;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2018
		rx->prev = (i == 0) ? nic->rxs + count - 1 : rx - 1;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2019
		if (e100_rx_alloc_skb(nic, rx)) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2020
			e100_rx_clean_list(nic);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2021
			return -ENOMEM;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2022
		}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2023
	}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2024
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2025
	if (!nic->ecdev) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2026
		/* Set the el-bit on the buffer that is before the last buffer.
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2027
		 * This lets us update the next pointer on the last buffer without
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2028
		 * worrying about hardware touching it.
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2029
		 * We set the size to 0 to prevent hardware from touching this buffer.
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2030
		 * When the hardware hits the before last buffer with el-bit and size
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2031
		 * of 0, it will RNR interrupt, the RU will go into the No Resources
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2032
		 * state.  It will not complete nor write to this buffer. */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2033
		rx = nic->rxs->prev->prev;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2034
		before_last = (struct rfd *)rx->skb->data;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2035
		before_last->command |= cpu_to_le16(cb_el);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2036
		before_last->size = 0;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2037
		pci_dma_sync_single_for_device(nic->pdev, rx->dma_addr,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2038
				sizeof(struct rfd), PCI_DMA_BIDIRECTIONAL);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2039
	}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2040
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2041
	nic->rx_to_use = nic->rx_to_clean = nic->rxs;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2042
	nic->ru_running = RU_SUSPENDED;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2043
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2044
	return 0;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2045
}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2046
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2047
static irqreturn_t e100_intr(int irq, void *dev_id)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2048
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2049
	struct net_device *netdev = dev_id;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2050
	struct nic *nic = netdev_priv(netdev);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2051
	u8 stat_ack = ioread8(&nic->csr->scb.stat_ack);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2052
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2053
	DPRINTK(INTR, DEBUG, "stat_ack = 0x%02X\n", stat_ack);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2054
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2055
	if (stat_ack == stat_ack_not_ours ||	/* Not our interrupt */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2056
	   stat_ack == stat_ack_not_present)	/* Hardware is ejected */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2057
		return IRQ_NONE;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2058
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2059
	/* Ack interrupt(s) */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2060
	iowrite8(stat_ack, &nic->csr->scb.stat_ack);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2061
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2062
	/* We hit Receive No Resource (RNR); restart RU after cleaning */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2063
	if (stat_ack & stat_ack_rnr)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2064
		nic->ru_running = RU_SUSPENDED;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2065
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2066
	if(!nic->ecdev && likely(netif_rx_schedule_prep(&nic->napi))) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2067
		e100_disable_irq(nic);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2068
		__netif_rx_schedule(&nic->napi);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2069
	}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2070
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2071
	return IRQ_HANDLED;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2072
}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2073
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2074
void e100_ec_poll(struct net_device *netdev)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2075
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2076
	struct nic *nic = netdev_priv(netdev);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2077
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2078
	e100_rx_clean(nic, NULL, 100);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2079
	e100_tx_clean(nic);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2080
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2081
    if (jiffies - nic->ec_watchdog_jiffies >= 2 * HZ) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2082
        e100_watchdog((unsigned long) nic);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2083
        nic->ec_watchdog_jiffies = jiffies;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2084
    }
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2085
}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2086
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2087
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2088
static int e100_poll(struct napi_struct *napi, int budget)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2089
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2090
	struct nic *nic = container_of(napi, struct nic, napi);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2091
	unsigned int work_done = 0;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2092
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2093
	e100_rx_clean(nic, &work_done, budget);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2094
	e100_tx_clean(nic);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2095
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2096
	/* If budget not fully consumed, exit the polling mode */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2097
	if (work_done < budget) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2098
		netif_rx_complete(napi);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2099
		e100_enable_irq(nic);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2100
	}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2101
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2102
	return work_done;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2103
}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2104
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2105
#ifdef CONFIG_NET_POLL_CONTROLLER
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2106
static void e100_netpoll(struct net_device *netdev)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2107
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2108
	struct nic *nic = netdev_priv(netdev);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2109
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2110
	e100_disable_irq(nic);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2111
	e100_intr(nic->pdev->irq, netdev);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2112
	e100_tx_clean(nic);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2113
	e100_enable_irq(nic);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2114
}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2115
#endif
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2116
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2117
static int e100_set_mac_address(struct net_device *netdev, void *p)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2118
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2119
	struct nic *nic = netdev_priv(netdev);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2120
	struct sockaddr *addr = p;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2121
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2122
	if (!is_valid_ether_addr(addr->sa_data))
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2123
		return -EADDRNOTAVAIL;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2124
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2125
	memcpy(netdev->dev_addr, addr->sa_data, netdev->addr_len);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2126
	e100_exec_cb(nic, NULL, e100_setup_iaaddr);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2127
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2128
	return 0;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2129
}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2130
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2131
static int e100_change_mtu(struct net_device *netdev, int new_mtu)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2132
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2133
	if (new_mtu < ETH_ZLEN || new_mtu > ETH_DATA_LEN)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2134
		return -EINVAL;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2135
	netdev->mtu = new_mtu;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2136
	return 0;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2137
}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2138
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2139
static int e100_asf(struct nic *nic)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2140
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2141
	/* ASF can be enabled from eeprom */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2142
	return((nic->pdev->device >= 0x1050) && (nic->pdev->device <= 0x1057) &&
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2143
	   (nic->eeprom[eeprom_config_asf] & eeprom_asf) &&
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2144
	   !(nic->eeprom[eeprom_config_asf] & eeprom_gcl) &&
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2145
	   ((nic->eeprom[eeprom_smbus_addr] & 0xFF) != 0xFE));
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2146
}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2147
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2148
static int e100_up(struct nic *nic)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2149
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2150
	int err;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2151
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2152
	if ((err = e100_rx_alloc_list(nic)))
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2153
		return err;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2154
	if ((err = e100_alloc_cbs(nic)))
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2155
		goto err_rx_clean_list;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2156
	if ((err = e100_hw_init(nic)))
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2157
		goto err_clean_cbs;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2158
	e100_set_multicast_list(nic->netdev);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2159
	e100_start_receiver(nic, NULL);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2160
	if (!nic->ecdev) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2161
		mod_timer(&nic->watchdog, jiffies);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2162
	}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2163
	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: 1505
diff changeset
  2164
		nic->netdev->name, nic->netdev)))
1505
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2165
		goto err_no_irq;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2166
	if (!nic->ecdev) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2167
		netif_wake_queue(nic->netdev);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2168
		napi_enable(&nic->napi);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2169
		/* enable ints _after_ enabling poll, preventing a race between
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2170
		 * disable ints+schedule */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2171
		e100_enable_irq(nic);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2172
	}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2173
	return 0;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2174
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2175
err_no_irq:
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2176
	if (!nic->ecdev)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2177
		del_timer_sync(&nic->watchdog);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2178
err_clean_cbs:
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2179
	e100_clean_cbs(nic);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2180
err_rx_clean_list:
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2181
	e100_rx_clean_list(nic);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2182
	return err;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2183
}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2184
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2185
static void e100_down(struct nic *nic)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2186
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2187
	if (!nic->ecdev) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2188
		/* wait here for poll to complete */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2189
		napi_disable(&nic->napi);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2190
		netif_stop_queue(nic->netdev);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2191
	}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2192
	e100_hw_reset(nic);
1506
41ca84fb6bb2 Fixed IRQ freeing bug in e100 drivers.
Florian Pose <fp@igh-essen.com>
parents: 1505
diff changeset
  2193
	free_irq(nic->pdev->irq, nic->netdev);
1505
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2194
	if (!nic->ecdev) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2195
		del_timer_sync(&nic->watchdog);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2196
		netif_carrier_off(nic->netdev);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2197
	}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2198
	e100_clean_cbs(nic);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2199
	e100_rx_clean_list(nic);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2200
}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2201
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2202
static void e100_tx_timeout(struct net_device *netdev)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2203
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2204
	struct nic *nic = netdev_priv(netdev);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2205
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2206
	/* Reset outside of interrupt context, to avoid request_irq
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2207
	 * in interrupt context */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2208
	schedule_work(&nic->tx_timeout_task);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2209
}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2210
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2211
static void e100_tx_timeout_task(struct work_struct *work)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2212
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2213
	struct nic *nic = container_of(work, struct nic, tx_timeout_task);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2214
	struct net_device *netdev = nic->netdev;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2215
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2216
	DPRINTK(TX_ERR, DEBUG, "scb.status=0x%02X\n",
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2217
		ioread8(&nic->csr->scb.status));
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2218
	e100_down(netdev_priv(netdev));
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2219
	e100_up(netdev_priv(netdev));
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2220
}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2221
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2222
static int e100_loopback_test(struct nic *nic, enum loopback loopback_mode)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2223
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2224
	int err;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2225
	struct sk_buff *skb;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2226
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2227
	/* Use driver resources to perform internal MAC or PHY
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2228
	 * loopback test.  A single packet is prepared and transmitted
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2229
	 * in loopback mode, and the test passes if the received
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2230
	 * packet compares byte-for-byte to the transmitted packet. */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2231
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2232
	if ((err = e100_rx_alloc_list(nic)))
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2233
		return err;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2234
	if ((err = e100_alloc_cbs(nic)))
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2235
		goto err_clean_rx;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2236
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2237
	/* ICH PHY loopback is broken so do MAC loopback instead */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2238
	if (nic->flags & ich && loopback_mode == lb_phy)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2239
		loopback_mode = lb_mac;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2240
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2241
	nic->loopback = loopback_mode;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2242
	if ((err = e100_hw_init(nic)))
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2243
		goto err_loopback_none;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2244
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2245
	if (loopback_mode == lb_phy)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2246
		mdio_write(nic->netdev, nic->mii.phy_id, MII_BMCR,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2247
			BMCR_LOOPBACK);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2248
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2249
	e100_start_receiver(nic, NULL);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2250
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2251
	if (!(skb = netdev_alloc_skb(nic->netdev, ETH_DATA_LEN))) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2252
		err = -ENOMEM;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2253
		goto err_loopback_none;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2254
	}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2255
	skb_put(skb, ETH_DATA_LEN);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2256
	memset(skb->data, 0xFF, ETH_DATA_LEN);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2257
	e100_xmit_frame(skb, nic->netdev);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2258
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2259
	msleep(10);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2260
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2261
	pci_dma_sync_single_for_cpu(nic->pdev, nic->rx_to_clean->dma_addr,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2262
			RFD_BUF_LEN, PCI_DMA_BIDIRECTIONAL);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2263
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2264
	if (memcmp(nic->rx_to_clean->skb->data + sizeof(struct rfd),
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2265
	   skb->data, ETH_DATA_LEN))
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2266
		err = -EAGAIN;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2267
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2268
err_loopback_none:
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2269
	mdio_write(nic->netdev, nic->mii.phy_id, MII_BMCR, 0);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2270
	nic->loopback = lb_none;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2271
	e100_clean_cbs(nic);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2272
	e100_hw_reset(nic);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2273
err_clean_rx:
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2274
	e100_rx_clean_list(nic);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2275
	return err;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2276
}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2277
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2278
#define MII_LED_CONTROL	0x1B
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2279
static void e100_blink_led(unsigned long data)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2280
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2281
	struct nic *nic = (struct nic *)data;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2282
	enum led_state {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2283
		led_on     = 0x01,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2284
		led_off    = 0x04,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2285
		led_on_559 = 0x05,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2286
		led_on_557 = 0x07,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2287
	};
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2288
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2289
	nic->leds = (nic->leds & led_on) ? led_off :
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2290
		(nic->mac < mac_82559_D101M) ? led_on_557 : led_on_559;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2291
	mdio_write(nic->netdev, nic->mii.phy_id, MII_LED_CONTROL, nic->leds);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2292
	mod_timer(&nic->blink_timer, jiffies + HZ / 4);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2293
}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2294
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2295
static int e100_get_settings(struct net_device *netdev, struct ethtool_cmd *cmd)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2296
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2297
	struct nic *nic = netdev_priv(netdev);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2298
	return mii_ethtool_gset(&nic->mii, cmd);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2299
}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2300
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2301
static int e100_set_settings(struct net_device *netdev, struct ethtool_cmd *cmd)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2302
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2303
	struct nic *nic = netdev_priv(netdev);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2304
	int err;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2305
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2306
	mdio_write(netdev, nic->mii.phy_id, MII_BMCR, BMCR_RESET);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2307
	err = mii_ethtool_sset(&nic->mii, cmd);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2308
	e100_exec_cb(nic, NULL, e100_configure);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2309
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2310
	return err;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2311
}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2312
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2313
static void e100_get_drvinfo(struct net_device *netdev,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2314
	struct ethtool_drvinfo *info)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2315
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2316
	struct nic *nic = netdev_priv(netdev);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2317
	strcpy(info->driver, DRV_NAME);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2318
	strcpy(info->version, DRV_VERSION);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2319
	strcpy(info->fw_version, "N/A");
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2320
	strcpy(info->bus_info, pci_name(nic->pdev));
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2321
}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2322
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2323
#define E100_PHY_REGS 0x1C
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2324
static int e100_get_regs_len(struct net_device *netdev)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2325
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2326
	struct nic *nic = netdev_priv(netdev);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2327
	return 1 + E100_PHY_REGS + sizeof(nic->mem->dump_buf);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2328
}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2329
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2330
static void e100_get_regs(struct net_device *netdev,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2331
	struct ethtool_regs *regs, void *p)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2332
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2333
	struct nic *nic = netdev_priv(netdev);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2334
	u32 *buff = p;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2335
	int i;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2336
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2337
	regs->version = (1 << 24) | nic->pdev->revision;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2338
	buff[0] = ioread8(&nic->csr->scb.cmd_hi) << 24 |
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2339
		ioread8(&nic->csr->scb.cmd_lo) << 16 |
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2340
		ioread16(&nic->csr->scb.status);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2341
	for (i = E100_PHY_REGS; i >= 0; i--)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2342
		buff[1 + E100_PHY_REGS - i] =
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2343
			mdio_read(netdev, nic->mii.phy_id, i);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2344
	memset(nic->mem->dump_buf, 0, sizeof(nic->mem->dump_buf));
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2345
	e100_exec_cb(nic, NULL, e100_dump);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2346
	msleep(10);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2347
	memcpy(&buff[2 + E100_PHY_REGS], nic->mem->dump_buf,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2348
		sizeof(nic->mem->dump_buf));
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2349
}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2350
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2351
static void e100_get_wol(struct net_device *netdev, struct ethtool_wolinfo *wol)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2352
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2353
	struct nic *nic = netdev_priv(netdev);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2354
	wol->supported = (nic->mac >= mac_82558_D101_A4) ?  WAKE_MAGIC : 0;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2355
	wol->wolopts = (nic->flags & wol_magic) ? WAKE_MAGIC : 0;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2356
}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2357
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2358
static int e100_set_wol(struct net_device *netdev, struct ethtool_wolinfo *wol)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2359
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2360
	struct nic *nic = netdev_priv(netdev);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2361
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2362
	if ((wol->wolopts && wol->wolopts != WAKE_MAGIC) ||
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2363
	    !device_can_wakeup(&nic->pdev->dev))
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2364
		return -EOPNOTSUPP;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2365
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2366
	if (wol->wolopts)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2367
		nic->flags |= wol_magic;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2368
	else
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2369
		nic->flags &= ~wol_magic;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2370
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2371
	device_set_wakeup_enable(&nic->pdev->dev, wol->wolopts);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2372
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2373
	e100_exec_cb(nic, NULL, e100_configure);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2374
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2375
	return 0;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2376
}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2377
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2378
static u32 e100_get_msglevel(struct net_device *netdev)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2379
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2380
	struct nic *nic = netdev_priv(netdev);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2381
	return nic->msg_enable;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2382
}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2383
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2384
static void e100_set_msglevel(struct net_device *netdev, u32 value)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2385
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2386
	struct nic *nic = netdev_priv(netdev);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2387
	nic->msg_enable = value;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2388
}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2389
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2390
static int e100_nway_reset(struct net_device *netdev)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2391
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2392
	struct nic *nic = netdev_priv(netdev);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2393
	return mii_nway_restart(&nic->mii);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2394
}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2395
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2396
static u32 e100_get_link(struct net_device *netdev)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2397
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2398
	struct nic *nic = netdev_priv(netdev);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2399
	return mii_link_ok(&nic->mii);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2400
}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2401
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2402
static int e100_get_eeprom_len(struct net_device *netdev)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2403
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2404
	struct nic *nic = netdev_priv(netdev);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2405
	return nic->eeprom_wc << 1;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2406
}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2407
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2408
#define E100_EEPROM_MAGIC	0x1234
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2409
static int e100_get_eeprom(struct net_device *netdev,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2410
	struct ethtool_eeprom *eeprom, u8 *bytes)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2411
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2412
	struct nic *nic = netdev_priv(netdev);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2413
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2414
	eeprom->magic = E100_EEPROM_MAGIC;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2415
	memcpy(bytes, &((u8 *)nic->eeprom)[eeprom->offset], eeprom->len);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2416
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2417
	return 0;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2418
}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2419
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2420
static int e100_set_eeprom(struct net_device *netdev,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2421
	struct ethtool_eeprom *eeprom, u8 *bytes)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2422
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2423
	struct nic *nic = netdev_priv(netdev);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2424
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2425
	if (eeprom->magic != E100_EEPROM_MAGIC)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2426
		return -EINVAL;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2427
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2428
	memcpy(&((u8 *)nic->eeprom)[eeprom->offset], bytes, eeprom->len);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2429
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2430
	return e100_eeprom_save(nic, eeprom->offset >> 1,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2431
		(eeprom->len >> 1) + 1);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2432
}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2433
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2434
static void e100_get_ringparam(struct net_device *netdev,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2435
	struct ethtool_ringparam *ring)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2436
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2437
	struct nic *nic = netdev_priv(netdev);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2438
	struct param_range *rfds = &nic->params.rfds;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2439
	struct param_range *cbs = &nic->params.cbs;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2440
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2441
	ring->rx_max_pending = rfds->max;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2442
	ring->tx_max_pending = cbs->max;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2443
	ring->rx_mini_max_pending = 0;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2444
	ring->rx_jumbo_max_pending = 0;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2445
	ring->rx_pending = rfds->count;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2446
	ring->tx_pending = cbs->count;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2447
	ring->rx_mini_pending = 0;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2448
	ring->rx_jumbo_pending = 0;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2449
}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2450
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2451
static int e100_set_ringparam(struct net_device *netdev,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2452
	struct ethtool_ringparam *ring)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2453
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2454
	struct nic *nic = netdev_priv(netdev);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2455
	struct param_range *rfds = &nic->params.rfds;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2456
	struct param_range *cbs = &nic->params.cbs;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2457
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2458
	if ((ring->rx_mini_pending) || (ring->rx_jumbo_pending))
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2459
		return -EINVAL;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2460
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2461
	if (netif_running(netdev))
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2462
		e100_down(nic);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2463
	rfds->count = max(ring->rx_pending, rfds->min);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2464
	rfds->count = min(rfds->count, rfds->max);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2465
	cbs->count = max(ring->tx_pending, cbs->min);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2466
	cbs->count = min(cbs->count, cbs->max);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2467
	DPRINTK(DRV, INFO, "Ring Param settings: rx: %d, tx %d\n",
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2468
	        rfds->count, cbs->count);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2469
	if (netif_running(netdev))
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2470
		e100_up(nic);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2471
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2472
	return 0;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2473
}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2474
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2475
static const char e100_gstrings_test[][ETH_GSTRING_LEN] = {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2476
	"Link test     (on/offline)",
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2477
	"Eeprom test   (on/offline)",
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2478
	"Self test        (offline)",
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2479
	"Mac loopback     (offline)",
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2480
	"Phy loopback     (offline)",
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2481
};
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2482
#define E100_TEST_LEN	ARRAY_SIZE(e100_gstrings_test)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2483
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2484
static void e100_diag_test(struct net_device *netdev,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2485
	struct ethtool_test *test, u64 *data)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2486
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2487
	struct ethtool_cmd cmd;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2488
	struct nic *nic = netdev_priv(netdev);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2489
	int i, err;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2490
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2491
	memset(data, 0, E100_TEST_LEN * sizeof(u64));
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2492
	data[0] = !mii_link_ok(&nic->mii);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2493
	data[1] = e100_eeprom_load(nic);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2494
	if (test->flags & ETH_TEST_FL_OFFLINE) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2495
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2496
		/* save speed, duplex & autoneg settings */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2497
		err = mii_ethtool_gset(&nic->mii, &cmd);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2498
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2499
		if (netif_running(netdev))
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2500
			e100_down(nic);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2501
		data[2] = e100_self_test(nic);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2502
		data[3] = e100_loopback_test(nic, lb_mac);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2503
		data[4] = e100_loopback_test(nic, lb_phy);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2504
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2505
		/* restore speed, duplex & autoneg settings */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2506
		err = mii_ethtool_sset(&nic->mii, &cmd);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2507
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2508
		if (netif_running(netdev))
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2509
			e100_up(nic);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2510
	}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2511
	for (i = 0; i < E100_TEST_LEN; i++)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2512
		test->flags |= data[i] ? ETH_TEST_FL_FAILED : 0;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2513
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2514
	msleep_interruptible(4 * 1000);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2515
}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2516
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2517
static int e100_phys_id(struct net_device *netdev, u32 data)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2518
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2519
	struct nic *nic = netdev_priv(netdev);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2520
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2521
	if (!data || data > (u32)(MAX_SCHEDULE_TIMEOUT / HZ))
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2522
		data = (u32)(MAX_SCHEDULE_TIMEOUT / HZ);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2523
	mod_timer(&nic->blink_timer, jiffies);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2524
	msleep_interruptible(data * 1000);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2525
	del_timer_sync(&nic->blink_timer);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2526
	mdio_write(netdev, nic->mii.phy_id, MII_LED_CONTROL, 0);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2527
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2528
	return 0;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2529
}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2530
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2531
static const char e100_gstrings_stats[][ETH_GSTRING_LEN] = {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2532
	"rx_packets", "tx_packets", "rx_bytes", "tx_bytes", "rx_errors",
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2533
	"tx_errors", "rx_dropped", "tx_dropped", "multicast", "collisions",
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2534
	"rx_length_errors", "rx_over_errors", "rx_crc_errors",
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2535
	"rx_frame_errors", "rx_fifo_errors", "rx_missed_errors",
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2536
	"tx_aborted_errors", "tx_carrier_errors", "tx_fifo_errors",
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2537
	"tx_heartbeat_errors", "tx_window_errors",
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2538
	/* device-specific stats */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2539
	"tx_deferred", "tx_single_collisions", "tx_multi_collisions",
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2540
	"tx_flow_control_pause", "rx_flow_control_pause",
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2541
	"rx_flow_control_unsupported", "tx_tco_packets", "rx_tco_packets",
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2542
};
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2543
#define E100_NET_STATS_LEN	21
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2544
#define E100_STATS_LEN	ARRAY_SIZE(e100_gstrings_stats)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2545
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2546
static int e100_get_sset_count(struct net_device *netdev, int sset)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2547
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2548
	switch (sset) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2549
	case ETH_SS_TEST:
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2550
		return E100_TEST_LEN;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2551
	case ETH_SS_STATS:
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2552
		return E100_STATS_LEN;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2553
	default:
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2554
		return -EOPNOTSUPP;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2555
	}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2556
}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2557
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2558
static void e100_get_ethtool_stats(struct net_device *netdev,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2559
	struct ethtool_stats *stats, u64 *data)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2560
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2561
	struct nic *nic = netdev_priv(netdev);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2562
	int i;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2563
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2564
	for (i = 0; i < E100_NET_STATS_LEN; i++)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2565
		data[i] = ((unsigned long *)&netdev->stats)[i];
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2566
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2567
	data[i++] = nic->tx_deferred;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2568
	data[i++] = nic->tx_single_collisions;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2569
	data[i++] = nic->tx_multiple_collisions;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2570
	data[i++] = nic->tx_fc_pause;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2571
	data[i++] = nic->rx_fc_pause;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2572
	data[i++] = nic->rx_fc_unsupported;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2573
	data[i++] = nic->tx_tco_frames;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2574
	data[i++] = nic->rx_tco_frames;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2575
}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2576
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2577
static void e100_get_strings(struct net_device *netdev, u32 stringset, u8 *data)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2578
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2579
	switch (stringset) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2580
	case ETH_SS_TEST:
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2581
		memcpy(data, *e100_gstrings_test, sizeof(e100_gstrings_test));
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2582
		break;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2583
	case ETH_SS_STATS:
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2584
		memcpy(data, *e100_gstrings_stats, sizeof(e100_gstrings_stats));
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2585
		break;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2586
	}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2587
}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2588
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2589
static const struct ethtool_ops e100_ethtool_ops = {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2590
	.get_settings		= e100_get_settings,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2591
	.set_settings		= e100_set_settings,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2592
	.get_drvinfo		= e100_get_drvinfo,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2593
	.get_regs_len		= e100_get_regs_len,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2594
	.get_regs		= e100_get_regs,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2595
	.get_wol		= e100_get_wol,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2596
	.set_wol		= e100_set_wol,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2597
	.get_msglevel		= e100_get_msglevel,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2598
	.set_msglevel		= e100_set_msglevel,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2599
	.nway_reset		= e100_nway_reset,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2600
	.get_link		= e100_get_link,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2601
	.get_eeprom_len		= e100_get_eeprom_len,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2602
	.get_eeprom		= e100_get_eeprom,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2603
	.set_eeprom		= e100_set_eeprom,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2604
	.get_ringparam		= e100_get_ringparam,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2605
	.set_ringparam		= e100_set_ringparam,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2606
	.self_test		= e100_diag_test,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2607
	.get_strings		= e100_get_strings,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2608
	.phys_id		= e100_phys_id,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2609
	.get_ethtool_stats	= e100_get_ethtool_stats,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2610
	.get_sset_count		= e100_get_sset_count,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2611
};
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2612
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2613
static int e100_do_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2614
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2615
	struct nic *nic = netdev_priv(netdev);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2616
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2617
	return generic_mii_ioctl(&nic->mii, if_mii(ifr), cmd, NULL);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2618
}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2619
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2620
static int e100_alloc(struct nic *nic)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2621
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2622
	nic->mem = pci_alloc_consistent(nic->pdev, sizeof(struct mem),
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2623
		&nic->dma_addr);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2624
	return nic->mem ? 0 : -ENOMEM;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2625
}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2626
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2627
static void e100_free(struct nic *nic)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2628
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2629
	if (nic->mem) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2630
		pci_free_consistent(nic->pdev, sizeof(struct mem),
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2631
			nic->mem, nic->dma_addr);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2632
		nic->mem = NULL;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2633
	}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2634
}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2635
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2636
static int e100_open(struct net_device *netdev)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2637
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2638
	struct nic *nic = netdev_priv(netdev);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2639
	int err = 0;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2640
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2641
	if (!nic->ecdev)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2642
		netif_carrier_off(netdev);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2643
	if ((err = e100_up(nic)))
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2644
		DPRINTK(IFUP, ERR, "Cannot open interface, aborting.\n");
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2645
	return err;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2646
}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2647
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2648
static int e100_close(struct net_device *netdev)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2649
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2650
	e100_down(netdev_priv(netdev));
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2651
	return 0;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2652
}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2653
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2654
static const struct net_device_ops e100_netdev_ops = {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2655
	.ndo_open		= e100_open,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2656
	.ndo_stop		= e100_close,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2657
	.ndo_start_xmit		= e100_xmit_frame,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2658
	.ndo_validate_addr	= eth_validate_addr,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2659
	.ndo_set_multicast_list	= e100_set_multicast_list,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2660
	.ndo_set_mac_address	= e100_set_mac_address,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2661
	.ndo_change_mtu		= e100_change_mtu,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2662
	.ndo_do_ioctl		= e100_do_ioctl,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2663
	.ndo_tx_timeout		= e100_tx_timeout,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2664
#ifdef CONFIG_NET_POLL_CONTROLLER
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2665
	.ndo_poll_controller	= e100_netpoll,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2666
#endif
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2667
};
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2668
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2669
static int __devinit e100_probe(struct pci_dev *pdev,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2670
	const struct pci_device_id *ent)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2671
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2672
	struct net_device *netdev;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2673
	struct nic *nic;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2674
	int err;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2675
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2676
	if (!(netdev = alloc_etherdev(sizeof(struct nic)))) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2677
		if (((1 << debug) - 1) & NETIF_MSG_PROBE)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2678
			printk(KERN_ERR PFX "Etherdev alloc failed, abort.\n");
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2679
		return -ENOMEM;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2680
	}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2681
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2682
	netdev->netdev_ops = &e100_netdev_ops;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2683
	SET_ETHTOOL_OPS(netdev, &e100_ethtool_ops);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2684
	netdev->watchdog_timeo = E100_WATCHDOG_PERIOD;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2685
	strncpy(netdev->name, pci_name(pdev), sizeof(netdev->name) - 1);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2686
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2687
	nic = netdev_priv(netdev);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2688
	netif_napi_add(netdev, &nic->napi, e100_poll, E100_NAPI_WEIGHT);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2689
	nic->netdev = netdev;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2690
	nic->pdev = pdev;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2691
	nic->msg_enable = (1 << debug) - 1;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2692
	pci_set_drvdata(pdev, netdev);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2693
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2694
	if ((err = pci_enable_device(pdev))) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2695
		DPRINTK(PROBE, ERR, "Cannot enable PCI device, aborting.\n");
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2696
		goto err_out_free_dev;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2697
	}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2698
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2699
	if (!(pci_resource_flags(pdev, 0) & IORESOURCE_MEM)) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2700
		DPRINTK(PROBE, ERR, "Cannot find proper PCI device "
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2701
			"base address, aborting.\n");
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2702
		err = -ENODEV;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2703
		goto err_out_disable_pdev;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2704
	}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2705
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2706
	if ((err = pci_request_regions(pdev, DRV_NAME))) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2707
		DPRINTK(PROBE, ERR, "Cannot obtain PCI resources, aborting.\n");
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2708
		goto err_out_disable_pdev;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2709
	}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2710
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2711
	if ((err = pci_set_dma_mask(pdev, DMA_32BIT_MASK))) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2712
		DPRINTK(PROBE, ERR, "No usable DMA configuration, aborting.\n");
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2713
		goto err_out_free_res;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2714
	}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2715
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2716
	SET_NETDEV_DEV(netdev, &pdev->dev);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2717
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2718
	if (use_io)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2719
		DPRINTK(PROBE, INFO, "using i/o access mode\n");
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2720
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2721
	nic->csr = pci_iomap(pdev, (use_io ? 1 : 0), sizeof(struct csr));
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2722
	if (!nic->csr) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2723
		DPRINTK(PROBE, ERR, "Cannot map device registers, aborting.\n");
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2724
		err = -ENOMEM;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2725
		goto err_out_free_res;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2726
	}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2727
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2728
	if (ent->driver_data)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2729
		nic->flags |= ich;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2730
	else
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2731
		nic->flags &= ~ich;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2732
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2733
	e100_get_defaults(nic);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2734
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2735
	/* locks must be initialized before calling hw_reset */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2736
	spin_lock_init(&nic->cb_lock);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2737
	spin_lock_init(&nic->cmd_lock);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2738
	spin_lock_init(&nic->mdio_lock);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2739
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2740
	/* Reset the device before pci_set_master() in case device is in some
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2741
	 * funky state and has an interrupt pending - hint: we don't have the
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2742
	 * interrupt handler registered yet. */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2743
	e100_hw_reset(nic);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2744
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2745
	pci_set_master(pdev);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2746
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2747
	init_timer(&nic->watchdog);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2748
	nic->watchdog.function = e100_watchdog;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2749
	nic->watchdog.data = (unsigned long)nic;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2750
	init_timer(&nic->blink_timer);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2751
	nic->blink_timer.function = e100_blink_led;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2752
	nic->blink_timer.data = (unsigned long)nic;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2753
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2754
	INIT_WORK(&nic->tx_timeout_task, e100_tx_timeout_task);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2755
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2756
	if ((err = e100_alloc(nic))) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2757
		DPRINTK(PROBE, ERR, "Cannot alloc driver memory, aborting.\n");
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2758
		goto err_out_iounmap;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2759
	}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2760
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2761
	if ((err = e100_eeprom_load(nic)))
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2762
		goto err_out_free;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2763
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2764
	e100_phy_init(nic);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2765
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2766
	memcpy(netdev->dev_addr, nic->eeprom, ETH_ALEN);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2767
	memcpy(netdev->perm_addr, nic->eeprom, ETH_ALEN);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2768
	if (!is_valid_ether_addr(netdev->perm_addr)) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2769
		if (!eeprom_bad_csum_allow) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2770
			DPRINTK(PROBE, ERR, "Invalid MAC address from "
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2771
			        "EEPROM, aborting.\n");
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2772
			err = -EAGAIN;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2773
			goto err_out_free;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2774
		} else {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2775
			DPRINTK(PROBE, ERR, "Invalid MAC address from EEPROM, "
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2776
			        "you MUST configure one.\n");
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2777
		}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2778
	}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2779
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2780
	/* Wol magic packet can be enabled from eeprom */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2781
	if ((nic->mac >= mac_82558_D101_A4) &&
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2782
	   (nic->eeprom[eeprom_id] & eeprom_id_wol)) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2783
		nic->flags |= wol_magic;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2784
		device_set_wakeup_enable(&pdev->dev, true);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2785
	}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2786
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2787
	/* ack any pending wake events, disable PME */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2788
	pci_pme_active(pdev, false);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2789
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2790
	// offer device to EtherCAT master module
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2791
	nic->ecdev = ecdev_offer(netdev, e100_ec_poll, THIS_MODULE);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2792
	if (nic->ecdev) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2793
		if (ecdev_open(nic->ecdev)) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2794
			ecdev_withdraw(nic->ecdev);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2795
			goto err_out_free;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2796
		}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2797
	} else {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2798
		strcpy(netdev->name, "eth%d");
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2799
		if((err = register_netdev(netdev))) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2800
			DPRINTK(PROBE, ERR, "Cannot register net device, aborting.\n");
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2801
			goto err_out_free;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2802
		}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2803
	}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2804
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2805
	DPRINTK(PROBE, INFO, "addr 0x%llx, irq %d, MAC addr %pM\n",
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2806
		(unsigned long long)pci_resource_start(pdev, use_io ? 1 : 0),
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2807
		pdev->irq, netdev->dev_addr);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2808
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2809
	return 0;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2810
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2811
err_out_free:
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2812
	e100_free(nic);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2813
err_out_iounmap:
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2814
	pci_iounmap(pdev, nic->csr);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2815
err_out_free_res:
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2816
	pci_release_regions(pdev);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2817
err_out_disable_pdev:
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2818
	pci_disable_device(pdev);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2819
err_out_free_dev:
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2820
	pci_set_drvdata(pdev, NULL);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2821
	free_netdev(netdev);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2822
	return err;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2823
}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2824
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2825
static void __devexit e100_remove(struct pci_dev *pdev)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2826
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2827
	struct net_device *netdev = pci_get_drvdata(pdev);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2828
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2829
	if (netdev) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2830
		struct nic *nic = netdev_priv(netdev);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2831
		if (nic->ecdev) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2832
			ecdev_close(nic->ecdev);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2833
			ecdev_withdraw(nic->ecdev);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2834
		} else {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2835
			unregister_netdev(netdev);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2836
		}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2837
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2838
		e100_free(nic);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2839
		pci_iounmap(pdev, nic->csr);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2840
		free_netdev(netdev);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2841
		pci_release_regions(pdev);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2842
		pci_disable_device(pdev);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2843
		pci_set_drvdata(pdev, NULL);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2844
	}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2845
}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2846
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2847
static int e100_suspend(struct pci_dev *pdev, pm_message_t state)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2848
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2849
	struct net_device *netdev = pci_get_drvdata(pdev);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2850
	struct nic *nic = netdev_priv(netdev);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2851
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2852
	if (nic->ecdev)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2853
		return 0;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2854
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2855
	if (netif_running(netdev))
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2856
		e100_down(nic);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2857
	netif_device_detach(netdev);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2858
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2859
	pci_save_state(pdev);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2860
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2861
	if ((nic->flags & wol_magic) | e100_asf(nic)) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2862
		if (pci_enable_wake(pdev, PCI_D3cold, true))
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2863
			pci_enable_wake(pdev, PCI_D3hot, true);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2864
	} else {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2865
		pci_enable_wake(pdev, PCI_D3hot, false);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2866
	}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2867
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2868
	pci_disable_device(pdev);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2869
	pci_set_power_state(pdev, PCI_D3hot);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2870
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2871
	return 0;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2872
}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2873
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2874
#ifdef CONFIG_PM
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2875
static int e100_resume(struct pci_dev *pdev)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2876
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2877
	struct net_device *netdev = pci_get_drvdata(pdev);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2878
	struct nic *nic = netdev_priv(netdev);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2879
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2880
	if (nic->ecdev)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2881
		return 0;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2882
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2883
	pci_set_power_state(pdev, PCI_D0);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2884
	pci_restore_state(pdev);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2885
	/* ack any pending wake events, disable PME */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2886
	pci_enable_wake(pdev, 0, 0);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2887
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2888
	netif_device_attach(netdev);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2889
	if (netif_running(netdev))
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2890
		e100_up(nic);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2891
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2892
	return 0;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2893
}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2894
#endif /* CONFIG_PM */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2895
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2896
static void e100_shutdown(struct pci_dev *pdev)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2897
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2898
	e100_suspend(pdev, PMSG_SUSPEND);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2899
}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2900
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2901
/* ------------------ PCI Error Recovery infrastructure  -------------- */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2902
/**
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2903
 * e100_io_error_detected - called when PCI error is detected.
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2904
 * @pdev: Pointer to PCI device
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2905
 * @state: The current pci connection state
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2906
 */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2907
static pci_ers_result_t e100_io_error_detected(struct pci_dev *pdev, pci_channel_state_t state)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2908
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2909
	struct net_device *netdev = pci_get_drvdata(pdev);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2910
	struct nic *nic = netdev_priv(netdev);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2911
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2912
	/* Similar to calling e100_down(), but avoids adapter I/O. */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2913
	e100_close(netdev);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2914
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2915
	if (!nic->ecdev) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2916
		/* Detach; put netif into a state similar to hotplug unplug. */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2917
		napi_enable(&nic->napi);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2918
		netif_device_detach(netdev);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2919
	}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2920
	pci_disable_device(pdev);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2921
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2922
	/* Request a slot reset. */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2923
	return PCI_ERS_RESULT_NEED_RESET;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2924
}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2925
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2926
/**
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2927
 * e100_io_slot_reset - called after the pci bus has been reset.
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2928
 * @pdev: Pointer to PCI device
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2929
 *
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2930
 * Restart the card from scratch.
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2931
 */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2932
static pci_ers_result_t e100_io_slot_reset(struct pci_dev *pdev)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2933
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2934
	struct net_device *netdev = pci_get_drvdata(pdev);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2935
	struct nic *nic = netdev_priv(netdev);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2936
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2937
	if (pci_enable_device(pdev)) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2938
		printk(KERN_ERR "e100: Cannot re-enable PCI device after reset.\n");
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2939
		return PCI_ERS_RESULT_DISCONNECT;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2940
	}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2941
	pci_set_master(pdev);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2942
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2943
	/* Only one device per card can do a reset */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2944
	if (0 != PCI_FUNC(pdev->devfn))
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2945
		return PCI_ERS_RESULT_RECOVERED;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2946
	e100_hw_reset(nic);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2947
	e100_phy_init(nic);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2948
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2949
	return PCI_ERS_RESULT_RECOVERED;
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2950
}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2951
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2952
/**
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2953
 * e100_io_resume - resume normal operations
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2954
 * @pdev: Pointer to PCI device
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2955
 *
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2956
 * Resume normal operations after an error recovery
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2957
 * sequence has been completed.
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2958
 */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2959
static void e100_io_resume(struct pci_dev *pdev)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2960
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2961
	struct net_device *netdev = pci_get_drvdata(pdev);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2962
	struct nic *nic = netdev_priv(netdev);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2963
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2964
	/* ack any pending wake events, disable PME */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2965
	pci_enable_wake(pdev, 0, 0);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2966
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2967
	if (!nic->ecdev)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2968
		netif_device_attach(netdev);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2969
	if (nic->ecdev || netif_running(netdev)) {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2970
		e100_open(netdev);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2971
		if (!nic->ecdev)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2972
			mod_timer(&nic->watchdog, jiffies);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2973
	}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2974
}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2975
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2976
static struct pci_error_handlers e100_err_handler = {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2977
	.error_detected = e100_io_error_detected,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2978
	.slot_reset = e100_io_slot_reset,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2979
	.resume = e100_io_resume,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2980
};
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2981
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2982
static struct pci_driver e100_driver = {
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2983
	.name =         DRV_NAME,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2984
	.id_table =     e100_id_table,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2985
	.probe =        e100_probe,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2986
	.remove =       __devexit_p(e100_remove),
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2987
#ifdef CONFIG_PM
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2988
	/* Power Management hooks */
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2989
	.suspend =      e100_suspend,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2990
	.resume =       e100_resume,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2991
#endif
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2992
	.shutdown =     e100_shutdown,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2993
	.err_handler = &e100_err_handler,
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2994
};
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2995
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2996
static int __init e100_init_module(void)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2997
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2998
	printk(KERN_INFO DRV_NAME " " DRV_DESCRIPTION " " DRV_VERSION
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2999
			", master " EC_MASTER_VERSION "\n");
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3000
 
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3001
 	return pci_register_driver(&e100_driver);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3002
}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3003
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3004
static void __exit e100_cleanup_module(void)
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3005
{
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3006
	printk(KERN_INFO DRV_NAME " cleaning up module...\n");
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3007
	pci_unregister_driver(&e100_driver);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3008
	printk(KERN_INFO DRV_NAME " module cleaned up.\n");
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3009
}
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3010
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3011
module_init(e100_init_module);
da637f7e4e3a Added e100 for kernel 2.6.29, thanks to Andre Puschmann.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3012
module_exit(e100_cleanup_module);