devices/e1000/e1000_main-2.6.22-orig.c
author Martin Troxler <martin.troxler@komaxgroup.com>
Tue, 15 Dec 2009 10:59:07 +0100
changeset 1601 a784812c787f
parent 788 9999ca1a1953
permissions -rw-r--r--
master FSM enables slave FSM
slave FSM should not be active when master is scanning or configuring the slaves
788
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     1
/*******************************************************************************
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     2
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     3
  Intel PRO/1000 Linux driver
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     4
  Copyright(c) 1999 - 2006 Intel Corporation.
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     5
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     6
  This program is free software; you can redistribute it and/or modify it
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     7
  under the terms and conditions of the GNU General Public License,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     8
  version 2, as published by the Free Software Foundation.
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     9
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    10
  This program is distributed in the hope it will be useful, but WITHOUT
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    11
  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    12
  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    13
  more details.
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    14
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    15
  You should have received a copy of the GNU General Public License along with
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    16
  this program; if not, write to the Free Software Foundation, Inc.,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    17
  51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    18
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    19
  The full GNU General Public License is included in this distribution in
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    20
  the file called "COPYING".
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    21
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    22
  Contact Information:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    23
  Linux NICS <linux.nics@intel.com>
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    24
  e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    25
  Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    26
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    27
*******************************************************************************/
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    28
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    29
#include "e1000.h"
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    30
#include <net/ip6_checksum.h>
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    31
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    32
char e1000_driver_name[] = "e1000";
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    33
static char e1000_driver_string[] = "Intel(R) PRO/1000 Network Driver";
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    34
#ifndef CONFIG_E1000_NAPI
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    35
#define DRIVERNAPI
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    36
#else
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    37
#define DRIVERNAPI "-NAPI"
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    38
#endif
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    39
#define DRV_VERSION "7.3.20-k2"DRIVERNAPI
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    40
char e1000_driver_version[] = DRV_VERSION;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    41
static char e1000_copyright[] = "Copyright (c) 1999-2006 Intel Corporation.";
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    42
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    43
/* e1000_pci_tbl - PCI Device ID Table
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    44
 *
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    45
 * Last entry must be all 0s
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    46
 *
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    47
 * Macro expands to...
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    48
 *   {PCI_DEVICE(PCI_VENDOR_ID_INTEL, device_id)}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    49
 */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    50
static struct pci_device_id e1000_pci_tbl[] = {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    51
	INTEL_E1000_ETHERNET_DEVICE(0x1000),
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    52
	INTEL_E1000_ETHERNET_DEVICE(0x1001),
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    53
	INTEL_E1000_ETHERNET_DEVICE(0x1004),
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    54
	INTEL_E1000_ETHERNET_DEVICE(0x1008),
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    55
	INTEL_E1000_ETHERNET_DEVICE(0x1009),
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    56
	INTEL_E1000_ETHERNET_DEVICE(0x100C),
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    57
	INTEL_E1000_ETHERNET_DEVICE(0x100D),
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    58
	INTEL_E1000_ETHERNET_DEVICE(0x100E),
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    59
	INTEL_E1000_ETHERNET_DEVICE(0x100F),
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    60
	INTEL_E1000_ETHERNET_DEVICE(0x1010),
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    61
	INTEL_E1000_ETHERNET_DEVICE(0x1011),
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    62
	INTEL_E1000_ETHERNET_DEVICE(0x1012),
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    63
	INTEL_E1000_ETHERNET_DEVICE(0x1013),
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    64
	INTEL_E1000_ETHERNET_DEVICE(0x1014),
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    65
	INTEL_E1000_ETHERNET_DEVICE(0x1015),
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    66
	INTEL_E1000_ETHERNET_DEVICE(0x1016),
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    67
	INTEL_E1000_ETHERNET_DEVICE(0x1017),
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    68
	INTEL_E1000_ETHERNET_DEVICE(0x1018),
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    69
	INTEL_E1000_ETHERNET_DEVICE(0x1019),
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    70
	INTEL_E1000_ETHERNET_DEVICE(0x101A),
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    71
	INTEL_E1000_ETHERNET_DEVICE(0x101D),
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    72
	INTEL_E1000_ETHERNET_DEVICE(0x101E),
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    73
	INTEL_E1000_ETHERNET_DEVICE(0x1026),
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    74
	INTEL_E1000_ETHERNET_DEVICE(0x1027),
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    75
	INTEL_E1000_ETHERNET_DEVICE(0x1028),
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    76
	INTEL_E1000_ETHERNET_DEVICE(0x1049),
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    77
	INTEL_E1000_ETHERNET_DEVICE(0x104A),
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    78
	INTEL_E1000_ETHERNET_DEVICE(0x104B),
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    79
	INTEL_E1000_ETHERNET_DEVICE(0x104C),
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    80
	INTEL_E1000_ETHERNET_DEVICE(0x104D),
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    81
	INTEL_E1000_ETHERNET_DEVICE(0x105E),
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    82
	INTEL_E1000_ETHERNET_DEVICE(0x105F),
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    83
	INTEL_E1000_ETHERNET_DEVICE(0x1060),
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    84
	INTEL_E1000_ETHERNET_DEVICE(0x1075),
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    85
	INTEL_E1000_ETHERNET_DEVICE(0x1076),
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    86
	INTEL_E1000_ETHERNET_DEVICE(0x1077),
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    87
	INTEL_E1000_ETHERNET_DEVICE(0x1078),
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    88
	INTEL_E1000_ETHERNET_DEVICE(0x1079),
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    89
	INTEL_E1000_ETHERNET_DEVICE(0x107A),
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    90
	INTEL_E1000_ETHERNET_DEVICE(0x107B),
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    91
	INTEL_E1000_ETHERNET_DEVICE(0x107C),
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    92
	INTEL_E1000_ETHERNET_DEVICE(0x107D),
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    93
	INTEL_E1000_ETHERNET_DEVICE(0x107E),
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    94
	INTEL_E1000_ETHERNET_DEVICE(0x107F),
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    95
	INTEL_E1000_ETHERNET_DEVICE(0x108A),
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    96
	INTEL_E1000_ETHERNET_DEVICE(0x108B),
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    97
	INTEL_E1000_ETHERNET_DEVICE(0x108C),
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    98
	INTEL_E1000_ETHERNET_DEVICE(0x1096),
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    99
	INTEL_E1000_ETHERNET_DEVICE(0x1098),
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   100
	INTEL_E1000_ETHERNET_DEVICE(0x1099),
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   101
	INTEL_E1000_ETHERNET_DEVICE(0x109A),
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   102
	INTEL_E1000_ETHERNET_DEVICE(0x10A4),
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   103
	INTEL_E1000_ETHERNET_DEVICE(0x10B5),
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   104
	INTEL_E1000_ETHERNET_DEVICE(0x10B9),
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   105
	INTEL_E1000_ETHERNET_DEVICE(0x10BA),
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   106
	INTEL_E1000_ETHERNET_DEVICE(0x10BB),
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   107
	INTEL_E1000_ETHERNET_DEVICE(0x10BC),
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   108
	INTEL_E1000_ETHERNET_DEVICE(0x10C4),
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   109
	INTEL_E1000_ETHERNET_DEVICE(0x10C5),
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   110
	/* required last entry */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   111
	{0,}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   112
};
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   113
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   114
MODULE_DEVICE_TABLE(pci, e1000_pci_tbl);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   115
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   116
int e1000_up(struct e1000_adapter *adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   117
void e1000_down(struct e1000_adapter *adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   118
void e1000_reinit_locked(struct e1000_adapter *adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   119
void e1000_reset(struct e1000_adapter *adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   120
int e1000_set_spd_dplx(struct e1000_adapter *adapter, uint16_t spddplx);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   121
int e1000_setup_all_tx_resources(struct e1000_adapter *adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   122
int e1000_setup_all_rx_resources(struct e1000_adapter *adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   123
void e1000_free_all_tx_resources(struct e1000_adapter *adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   124
void e1000_free_all_rx_resources(struct e1000_adapter *adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   125
static int e1000_setup_tx_resources(struct e1000_adapter *adapter,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   126
                             struct e1000_tx_ring *txdr);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   127
static int e1000_setup_rx_resources(struct e1000_adapter *adapter,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   128
                             struct e1000_rx_ring *rxdr);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   129
static void e1000_free_tx_resources(struct e1000_adapter *adapter,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   130
                             struct e1000_tx_ring *tx_ring);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   131
static void e1000_free_rx_resources(struct e1000_adapter *adapter,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   132
                             struct e1000_rx_ring *rx_ring);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   133
void e1000_update_stats(struct e1000_adapter *adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   134
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   135
static int e1000_init_module(void);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   136
static void e1000_exit_module(void);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   137
static int e1000_probe(struct pci_dev *pdev, const struct pci_device_id *ent);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   138
static void __devexit e1000_remove(struct pci_dev *pdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   139
static int e1000_alloc_queues(struct e1000_adapter *adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   140
static int e1000_sw_init(struct e1000_adapter *adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   141
static int e1000_open(struct net_device *netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   142
static int e1000_close(struct net_device *netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   143
static void e1000_configure_tx(struct e1000_adapter *adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   144
static void e1000_configure_rx(struct e1000_adapter *adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   145
static void e1000_setup_rctl(struct e1000_adapter *adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   146
static void e1000_clean_all_tx_rings(struct e1000_adapter *adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   147
static void e1000_clean_all_rx_rings(struct e1000_adapter *adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   148
static void e1000_clean_tx_ring(struct e1000_adapter *adapter,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   149
                                struct e1000_tx_ring *tx_ring);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   150
static void e1000_clean_rx_ring(struct e1000_adapter *adapter,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   151
                                struct e1000_rx_ring *rx_ring);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   152
static void e1000_set_multi(struct net_device *netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   153
static void e1000_update_phy_info(unsigned long data);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   154
static void e1000_watchdog(unsigned long data);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   155
static void e1000_82547_tx_fifo_stall(unsigned long data);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   156
static int e1000_xmit_frame(struct sk_buff *skb, struct net_device *netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   157
static struct net_device_stats * e1000_get_stats(struct net_device *netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   158
static int e1000_change_mtu(struct net_device *netdev, int new_mtu);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   159
static int e1000_set_mac(struct net_device *netdev, void *p);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   160
static irqreturn_t e1000_intr(int irq, void *data);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   161
static irqreturn_t e1000_intr_msi(int irq, void *data);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   162
static boolean_t e1000_clean_tx_irq(struct e1000_adapter *adapter,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   163
                                    struct e1000_tx_ring *tx_ring);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   164
#ifdef CONFIG_E1000_NAPI
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   165
static int e1000_clean(struct net_device *poll_dev, int *budget);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   166
static boolean_t e1000_clean_rx_irq(struct e1000_adapter *adapter,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   167
                                    struct e1000_rx_ring *rx_ring,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   168
                                    int *work_done, int work_to_do);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   169
static boolean_t e1000_clean_rx_irq_ps(struct e1000_adapter *adapter,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   170
                                       struct e1000_rx_ring *rx_ring,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   171
                                       int *work_done, int work_to_do);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   172
#else
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   173
static boolean_t e1000_clean_rx_irq(struct e1000_adapter *adapter,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   174
                                    struct e1000_rx_ring *rx_ring);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   175
static boolean_t e1000_clean_rx_irq_ps(struct e1000_adapter *adapter,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   176
                                       struct e1000_rx_ring *rx_ring);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   177
#endif
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   178
static void e1000_alloc_rx_buffers(struct e1000_adapter *adapter,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   179
                                   struct e1000_rx_ring *rx_ring,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   180
				   int cleaned_count);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   181
static void e1000_alloc_rx_buffers_ps(struct e1000_adapter *adapter,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   182
                                      struct e1000_rx_ring *rx_ring,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   183
				      int cleaned_count);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   184
static int e1000_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   185
static int e1000_mii_ioctl(struct net_device *netdev, struct ifreq *ifr,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   186
			   int cmd);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   187
void e1000_set_ethtool_ops(struct net_device *netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   188
static void e1000_enter_82542_rst(struct e1000_adapter *adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   189
static void e1000_leave_82542_rst(struct e1000_adapter *adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   190
static void e1000_tx_timeout(struct net_device *dev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   191
static void e1000_reset_task(struct work_struct *work);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   192
static void e1000_smartspeed(struct e1000_adapter *adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   193
static int e1000_82547_fifo_workaround(struct e1000_adapter *adapter,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   194
                                       struct sk_buff *skb);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   195
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   196
static void e1000_vlan_rx_register(struct net_device *netdev, struct vlan_group *grp);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   197
static void e1000_vlan_rx_add_vid(struct net_device *netdev, uint16_t vid);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   198
static void e1000_vlan_rx_kill_vid(struct net_device *netdev, uint16_t vid);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   199
static void e1000_restore_vlan(struct e1000_adapter *adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   200
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   201
static int e1000_suspend(struct pci_dev *pdev, pm_message_t state);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   202
#ifdef CONFIG_PM
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   203
static int e1000_resume(struct pci_dev *pdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   204
#endif
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   205
static void e1000_shutdown(struct pci_dev *pdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   206
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   207
#ifdef CONFIG_NET_POLL_CONTROLLER
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   208
/* for netdump / net console */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   209
static void e1000_netpoll (struct net_device *netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   210
#endif
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   211
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   212
extern void e1000_check_options(struct e1000_adapter *adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   213
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   214
#define COPYBREAK_DEFAULT 256
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   215
static unsigned int copybreak __read_mostly = COPYBREAK_DEFAULT;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   216
module_param(copybreak, uint, 0644);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   217
MODULE_PARM_DESC(copybreak,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   218
	"Maximum size of packet that is copied to a new buffer on receive");
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   219
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   220
static pci_ers_result_t e1000_io_error_detected(struct pci_dev *pdev,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   221
                     pci_channel_state_t state);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   222
static pci_ers_result_t e1000_io_slot_reset(struct pci_dev *pdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   223
static void e1000_io_resume(struct pci_dev *pdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   224
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   225
static struct pci_error_handlers e1000_err_handler = {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   226
	.error_detected = e1000_io_error_detected,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   227
	.slot_reset = e1000_io_slot_reset,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   228
	.resume = e1000_io_resume,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   229
};
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   230
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   231
static struct pci_driver e1000_driver = {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   232
	.name     = e1000_driver_name,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   233
	.id_table = e1000_pci_tbl,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   234
	.probe    = e1000_probe,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   235
	.remove   = __devexit_p(e1000_remove),
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   236
#ifdef CONFIG_PM
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   237
	/* Power Managment Hooks */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   238
	.suspend  = e1000_suspend,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   239
	.resume   = e1000_resume,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   240
#endif
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   241
	.shutdown = e1000_shutdown,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   242
	.err_handler = &e1000_err_handler
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   243
};
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   244
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   245
MODULE_AUTHOR("Intel Corporation, <linux.nics@intel.com>");
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   246
MODULE_DESCRIPTION("Intel(R) PRO/1000 Network Driver");
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   247
MODULE_LICENSE("GPL");
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   248
MODULE_VERSION(DRV_VERSION);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   249
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   250
static int debug = NETIF_MSG_DRV | NETIF_MSG_PROBE;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   251
module_param(debug, int, 0);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   252
MODULE_PARM_DESC(debug, "Debug level (0=none,...,16=all)");
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   253
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   254
/**
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   255
 * e1000_init_module - Driver Registration Routine
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   256
 *
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   257
 * e1000_init_module is the first routine called when the driver is
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   258
 * loaded. All it does is register with the PCI subsystem.
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   259
 **/
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   260
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   261
static int __init
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   262
e1000_init_module(void)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   263
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   264
	int ret;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   265
	printk(KERN_INFO "%s - version %s\n",
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   266
	       e1000_driver_string, e1000_driver_version);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   267
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   268
	printk(KERN_INFO "%s\n", e1000_copyright);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   269
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   270
	ret = pci_register_driver(&e1000_driver);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   271
	if (copybreak != COPYBREAK_DEFAULT) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   272
		if (copybreak == 0)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   273
			printk(KERN_INFO "e1000: copybreak disabled\n");
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   274
		else
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   275
			printk(KERN_INFO "e1000: copybreak enabled for "
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   276
			       "packets <= %u bytes\n", copybreak);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   277
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   278
	return ret;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   279
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   280
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   281
module_init(e1000_init_module);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   282
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   283
/**
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   284
 * e1000_exit_module - Driver Exit Cleanup Routine
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   285
 *
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   286
 * e1000_exit_module is called just before the driver is removed
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   287
 * from memory.
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   288
 **/
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   289
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   290
static void __exit
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   291
e1000_exit_module(void)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   292
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   293
	pci_unregister_driver(&e1000_driver);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   294
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   295
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   296
module_exit(e1000_exit_module);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   297
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   298
static int e1000_request_irq(struct e1000_adapter *adapter)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   299
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   300
	struct net_device *netdev = adapter->netdev;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   301
	void (*handler) = &e1000_intr;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   302
	int irq_flags = IRQF_SHARED;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   303
	int err;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   304
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   305
	if (adapter->hw.mac_type >= e1000_82571) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   306
		adapter->have_msi = !pci_enable_msi(adapter->pdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   307
		if (adapter->have_msi) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   308
			handler = &e1000_intr_msi;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   309
			irq_flags = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   310
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   311
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   312
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   313
	err = request_irq(adapter->pdev->irq, handler, irq_flags, netdev->name,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   314
	                  netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   315
	if (err) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   316
		if (adapter->have_msi)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   317
			pci_disable_msi(adapter->pdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   318
		DPRINTK(PROBE, ERR,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   319
		        "Unable to allocate interrupt Error: %d\n", err);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   320
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   321
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   322
	return err;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   323
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   324
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   325
static void e1000_free_irq(struct e1000_adapter *adapter)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   326
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   327
	struct net_device *netdev = adapter->netdev;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   328
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   329
	free_irq(adapter->pdev->irq, netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   330
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   331
	if (adapter->have_msi)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   332
		pci_disable_msi(adapter->pdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   333
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   334
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   335
/**
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   336
 * e1000_irq_disable - Mask off interrupt generation on the NIC
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   337
 * @adapter: board private structure
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   338
 **/
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   339
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   340
static void
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   341
e1000_irq_disable(struct e1000_adapter *adapter)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   342
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   343
	atomic_inc(&adapter->irq_sem);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   344
	E1000_WRITE_REG(&adapter->hw, IMC, ~0);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   345
	E1000_WRITE_FLUSH(&adapter->hw);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   346
	synchronize_irq(adapter->pdev->irq);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   347
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   348
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   349
/**
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   350
 * e1000_irq_enable - Enable default interrupt generation settings
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   351
 * @adapter: board private structure
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   352
 **/
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   353
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   354
static void
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   355
e1000_irq_enable(struct e1000_adapter *adapter)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   356
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   357
	if (likely(atomic_dec_and_test(&adapter->irq_sem))) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   358
		E1000_WRITE_REG(&adapter->hw, IMS, IMS_ENABLE_MASK);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   359
		E1000_WRITE_FLUSH(&adapter->hw);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   360
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   361
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   362
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   363
static void
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   364
e1000_update_mng_vlan(struct e1000_adapter *adapter)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   365
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   366
	struct net_device *netdev = adapter->netdev;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   367
	uint16_t vid = adapter->hw.mng_cookie.vlan_id;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   368
	uint16_t old_vid = adapter->mng_vlan_id;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   369
	if (adapter->vlgrp) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   370
		if (!vlan_group_get_device(adapter->vlgrp, vid)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   371
			if (adapter->hw.mng_cookie.status &
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   372
				E1000_MNG_DHCP_COOKIE_STATUS_VLAN_SUPPORT) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   373
				e1000_vlan_rx_add_vid(netdev, vid);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   374
				adapter->mng_vlan_id = vid;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   375
			} else
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   376
				adapter->mng_vlan_id = E1000_MNG_VLAN_NONE;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   377
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   378
			if ((old_vid != (uint16_t)E1000_MNG_VLAN_NONE) &&
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   379
					(vid != old_vid) &&
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   380
			    !vlan_group_get_device(adapter->vlgrp, old_vid))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   381
				e1000_vlan_rx_kill_vid(netdev, old_vid);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   382
		} else
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   383
			adapter->mng_vlan_id = vid;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   384
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   385
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   386
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   387
/**
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   388
 * e1000_release_hw_control - release control of the h/w to f/w
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   389
 * @adapter: address of board private structure
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   390
 *
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   391
 * e1000_release_hw_control resets {CTRL_EXT|FWSM}:DRV_LOAD bit.
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   392
 * For ASF and Pass Through versions of f/w this means that the
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   393
 * driver is no longer loaded. For AMT version (only with 82573) i
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   394
 * of the f/w this means that the network i/f is closed.
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   395
 *
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   396
 **/
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   397
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   398
static void
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   399
e1000_release_hw_control(struct e1000_adapter *adapter)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   400
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   401
	uint32_t ctrl_ext;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   402
	uint32_t swsm;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   403
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   404
	/* Let firmware taken over control of h/w */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   405
	switch (adapter->hw.mac_type) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   406
	case e1000_82573:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   407
		swsm = E1000_READ_REG(&adapter->hw, SWSM);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   408
		E1000_WRITE_REG(&adapter->hw, SWSM,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   409
				swsm & ~E1000_SWSM_DRV_LOAD);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   410
		break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   411
	case e1000_82571:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   412
	case e1000_82572:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   413
	case e1000_80003es2lan:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   414
	case e1000_ich8lan:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   415
		ctrl_ext = E1000_READ_REG(&adapter->hw, CTRL_EXT);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   416
		E1000_WRITE_REG(&adapter->hw, CTRL_EXT,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   417
				ctrl_ext & ~E1000_CTRL_EXT_DRV_LOAD);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   418
		break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   419
	default:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   420
		break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   421
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   422
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   423
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   424
/**
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   425
 * e1000_get_hw_control - get control of the h/w from f/w
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   426
 * @adapter: address of board private structure
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   427
 *
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   428
 * e1000_get_hw_control sets {CTRL_EXT|FWSM}:DRV_LOAD bit.
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   429
 * For ASF and Pass Through versions of f/w this means that
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   430
 * the driver is loaded. For AMT version (only with 82573)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   431
 * of the f/w this means that the network i/f is open.
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   432
 *
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   433
 **/
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   434
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   435
static void
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   436
e1000_get_hw_control(struct e1000_adapter *adapter)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   437
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   438
	uint32_t ctrl_ext;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   439
	uint32_t swsm;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   440
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   441
	/* Let firmware know the driver has taken over */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   442
	switch (adapter->hw.mac_type) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   443
	case e1000_82573:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   444
		swsm = E1000_READ_REG(&adapter->hw, SWSM);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   445
		E1000_WRITE_REG(&adapter->hw, SWSM,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   446
				swsm | E1000_SWSM_DRV_LOAD);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   447
		break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   448
	case e1000_82571:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   449
	case e1000_82572:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   450
	case e1000_80003es2lan:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   451
	case e1000_ich8lan:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   452
		ctrl_ext = E1000_READ_REG(&adapter->hw, CTRL_EXT);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   453
		E1000_WRITE_REG(&adapter->hw, CTRL_EXT,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   454
				ctrl_ext | E1000_CTRL_EXT_DRV_LOAD);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   455
		break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   456
	default:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   457
		break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   458
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   459
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   460
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   461
static void
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   462
e1000_init_manageability(struct e1000_adapter *adapter)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   463
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   464
	if (adapter->en_mng_pt) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   465
		uint32_t manc = E1000_READ_REG(&adapter->hw, MANC);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   466
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   467
		/* disable hardware interception of ARP */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   468
		manc &= ~(E1000_MANC_ARP_EN);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   469
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   470
		/* enable receiving management packets to the host */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   471
		/* this will probably generate destination unreachable messages
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   472
		 * from the host OS, but the packets will be handled on SMBUS */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   473
		if (adapter->hw.has_manc2h) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   474
			uint32_t manc2h = E1000_READ_REG(&adapter->hw, MANC2H);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   475
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   476
			manc |= E1000_MANC_EN_MNG2HOST;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   477
#define E1000_MNG2HOST_PORT_623 (1 << 5)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   478
#define E1000_MNG2HOST_PORT_664 (1 << 6)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   479
			manc2h |= E1000_MNG2HOST_PORT_623;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   480
			manc2h |= E1000_MNG2HOST_PORT_664;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   481
			E1000_WRITE_REG(&adapter->hw, MANC2H, manc2h);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   482
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   483
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   484
		E1000_WRITE_REG(&adapter->hw, MANC, manc);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   485
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   486
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   487
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   488
static void
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   489
e1000_release_manageability(struct e1000_adapter *adapter)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   490
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   491
	if (adapter->en_mng_pt) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   492
		uint32_t manc = E1000_READ_REG(&adapter->hw, MANC);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   493
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   494
		/* re-enable hardware interception of ARP */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   495
		manc |= E1000_MANC_ARP_EN;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   496
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   497
		if (adapter->hw.has_manc2h)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   498
			manc &= ~E1000_MANC_EN_MNG2HOST;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   499
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   500
		/* don't explicitly have to mess with MANC2H since
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   501
		 * MANC has an enable disable that gates MANC2H */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   502
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   503
		E1000_WRITE_REG(&adapter->hw, MANC, manc);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   504
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   505
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   506
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   507
/**
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   508
 * e1000_configure - configure the hardware for RX and TX
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   509
 * @adapter = private board structure
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   510
 **/
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   511
static void e1000_configure(struct e1000_adapter *adapter)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   512
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   513
	struct net_device *netdev = adapter->netdev;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   514
	int i;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   515
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   516
	e1000_set_multi(netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   517
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   518
	e1000_restore_vlan(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   519
	e1000_init_manageability(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   520
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   521
	e1000_configure_tx(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   522
	e1000_setup_rctl(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   523
	e1000_configure_rx(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   524
	/* call E1000_DESC_UNUSED which always leaves
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   525
	 * at least 1 descriptor unused to make sure
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   526
	 * next_to_use != next_to_clean */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   527
	for (i = 0; i < adapter->num_rx_queues; i++) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   528
		struct e1000_rx_ring *ring = &adapter->rx_ring[i];
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   529
		adapter->alloc_rx_buf(adapter, ring,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   530
		                      E1000_DESC_UNUSED(ring));
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   531
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   532
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   533
	adapter->tx_queue_len = netdev->tx_queue_len;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   534
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   535
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   536
int e1000_up(struct e1000_adapter *adapter)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   537
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   538
	/* hardware has been reset, we need to reload some things */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   539
	e1000_configure(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   540
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   541
	clear_bit(__E1000_DOWN, &adapter->flags);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   542
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   543
#ifdef CONFIG_E1000_NAPI
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   544
	netif_poll_enable(adapter->netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   545
#endif
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   546
	e1000_irq_enable(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   547
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   548
	/* fire a link change interrupt to start the watchdog */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   549
	E1000_WRITE_REG(&adapter->hw, ICS, E1000_ICS_LSC);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   550
	return 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   551
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   552
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   553
/**
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   554
 * e1000_power_up_phy - restore link in case the phy was powered down
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   555
 * @adapter: address of board private structure
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   556
 *
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   557
 * The phy may be powered down to save power and turn off link when the
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   558
 * driver is unloaded and wake on lan is not enabled (among others)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   559
 * *** this routine MUST be followed by a call to e1000_reset ***
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   560
 *
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   561
 **/
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   562
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   563
void e1000_power_up_phy(struct e1000_adapter *adapter)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   564
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   565
	uint16_t mii_reg = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   566
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   567
	/* Just clear the power down bit to wake the phy back up */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   568
	if (adapter->hw.media_type == e1000_media_type_copper) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   569
		/* according to the manual, the phy will retain its
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   570
		 * settings across a power-down/up cycle */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   571
		e1000_read_phy_reg(&adapter->hw, PHY_CTRL, &mii_reg);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   572
		mii_reg &= ~MII_CR_POWER_DOWN;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   573
		e1000_write_phy_reg(&adapter->hw, PHY_CTRL, mii_reg);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   574
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   575
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   576
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   577
static void e1000_power_down_phy(struct e1000_adapter *adapter)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   578
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   579
	/* Power down the PHY so no link is implied when interface is down *
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   580
	 * The PHY cannot be powered down if any of the following is TRUE *
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   581
	 * (a) WoL is enabled
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   582
	 * (b) AMT is active
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   583
	 * (c) SoL/IDER session is active */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   584
	if (!adapter->wol && adapter->hw.mac_type >= e1000_82540 &&
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   585
	   adapter->hw.media_type == e1000_media_type_copper) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   586
		uint16_t mii_reg = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   587
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   588
		switch (adapter->hw.mac_type) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   589
		case e1000_82540:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   590
		case e1000_82545:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   591
		case e1000_82545_rev_3:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   592
		case e1000_82546:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   593
		case e1000_82546_rev_3:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   594
		case e1000_82541:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   595
		case e1000_82541_rev_2:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   596
		case e1000_82547:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   597
		case e1000_82547_rev_2:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   598
			if (E1000_READ_REG(&adapter->hw, MANC) &
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   599
			    E1000_MANC_SMBUS_EN)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   600
				goto out;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   601
			break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   602
		case e1000_82571:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   603
		case e1000_82572:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   604
		case e1000_82573:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   605
		case e1000_80003es2lan:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   606
		case e1000_ich8lan:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   607
			if (e1000_check_mng_mode(&adapter->hw) ||
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   608
			    e1000_check_phy_reset_block(&adapter->hw))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   609
				goto out;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   610
			break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   611
		default:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   612
			goto out;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   613
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   614
		e1000_read_phy_reg(&adapter->hw, PHY_CTRL, &mii_reg);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   615
		mii_reg |= MII_CR_POWER_DOWN;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   616
		e1000_write_phy_reg(&adapter->hw, PHY_CTRL, mii_reg);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   617
		mdelay(1);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   618
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   619
out:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   620
	return;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   621
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   622
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   623
void
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   624
e1000_down(struct e1000_adapter *adapter)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   625
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   626
	struct net_device *netdev = adapter->netdev;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   627
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   628
	/* signal that we're down so the interrupt handler does not
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   629
	 * reschedule our watchdog timer */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   630
	set_bit(__E1000_DOWN, &adapter->flags);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   631
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   632
#ifdef CONFIG_E1000_NAPI
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   633
	netif_poll_disable(netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   634
#endif
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   635
	e1000_irq_disable(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   636
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   637
	del_timer_sync(&adapter->tx_fifo_stall_timer);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   638
	del_timer_sync(&adapter->watchdog_timer);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   639
	del_timer_sync(&adapter->phy_info_timer);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   640
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   641
	netdev->tx_queue_len = adapter->tx_queue_len;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   642
	adapter->link_speed = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   643
	adapter->link_duplex = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   644
	netif_carrier_off(netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   645
	netif_stop_queue(netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   646
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   647
	e1000_reset(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   648
	e1000_clean_all_tx_rings(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   649
	e1000_clean_all_rx_rings(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   650
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   651
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   652
void
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   653
e1000_reinit_locked(struct e1000_adapter *adapter)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   654
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   655
	WARN_ON(in_interrupt());
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   656
	while (test_and_set_bit(__E1000_RESETTING, &adapter->flags))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   657
		msleep(1);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   658
	e1000_down(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   659
	e1000_up(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   660
	clear_bit(__E1000_RESETTING, &adapter->flags);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   661
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   662
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   663
void
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   664
e1000_reset(struct e1000_adapter *adapter)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   665
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   666
	uint32_t pba = 0, tx_space, min_tx_space, min_rx_space;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   667
	uint16_t fc_high_water_mark = E1000_FC_HIGH_DIFF;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   668
	boolean_t legacy_pba_adjust = FALSE;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   669
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   670
	/* Repartition Pba for greater than 9k mtu
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   671
	 * To take effect CTRL.RST is required.
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   672
	 */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   673
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   674
	switch (adapter->hw.mac_type) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   675
	case e1000_82542_rev2_0:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   676
	case e1000_82542_rev2_1:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   677
	case e1000_82543:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   678
	case e1000_82544:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   679
	case e1000_82540:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   680
	case e1000_82541:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   681
	case e1000_82541_rev_2:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   682
		legacy_pba_adjust = TRUE;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   683
		pba = E1000_PBA_48K;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   684
		break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   685
	case e1000_82545:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   686
	case e1000_82545_rev_3:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   687
	case e1000_82546:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   688
	case e1000_82546_rev_3:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   689
		pba = E1000_PBA_48K;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   690
		break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   691
	case e1000_82547:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   692
	case e1000_82547_rev_2:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   693
		legacy_pba_adjust = TRUE;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   694
		pba = E1000_PBA_30K;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   695
		break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   696
	case e1000_82571:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   697
	case e1000_82572:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   698
	case e1000_80003es2lan:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   699
		pba = E1000_PBA_38K;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   700
		break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   701
	case e1000_82573:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   702
		pba = E1000_PBA_20K;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   703
		break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   704
	case e1000_ich8lan:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   705
		pba = E1000_PBA_8K;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   706
	case e1000_undefined:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   707
	case e1000_num_macs:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   708
		break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   709
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   710
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   711
	if (legacy_pba_adjust == TRUE) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   712
		if (adapter->netdev->mtu > E1000_RXBUFFER_8192)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   713
			pba -= 8; /* allocate more FIFO for Tx */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   714
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   715
		if (adapter->hw.mac_type == e1000_82547) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   716
			adapter->tx_fifo_head = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   717
			adapter->tx_head_addr = pba << E1000_TX_HEAD_ADDR_SHIFT;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   718
			adapter->tx_fifo_size =
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   719
				(E1000_PBA_40K - pba) << E1000_PBA_BYTES_SHIFT;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   720
			atomic_set(&adapter->tx_fifo_stall, 0);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   721
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   722
	} else if (adapter->hw.max_frame_size > MAXIMUM_ETHERNET_FRAME_SIZE) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   723
		/* adjust PBA for jumbo frames */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   724
		E1000_WRITE_REG(&adapter->hw, PBA, pba);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   725
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   726
		/* To maintain wire speed transmits, the Tx FIFO should be
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   727
		 * large enough to accomodate two full transmit packets,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   728
		 * rounded up to the next 1KB and expressed in KB.  Likewise,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   729
		 * the Rx FIFO should be large enough to accomodate at least
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   730
		 * one full receive packet and is similarly rounded up and
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   731
		 * expressed in KB. */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   732
		pba = E1000_READ_REG(&adapter->hw, PBA);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   733
		/* upper 16 bits has Tx packet buffer allocation size in KB */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   734
		tx_space = pba >> 16;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   735
		/* lower 16 bits has Rx packet buffer allocation size in KB */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   736
		pba &= 0xffff;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   737
		/* don't include ethernet FCS because hardware appends/strips */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   738
		min_rx_space = adapter->netdev->mtu + ENET_HEADER_SIZE +
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   739
		               VLAN_TAG_SIZE;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   740
		min_tx_space = min_rx_space;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   741
		min_tx_space *= 2;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   742
		min_tx_space = ALIGN(min_tx_space, 1024);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   743
		min_tx_space >>= 10;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   744
		min_rx_space = ALIGN(min_rx_space, 1024);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   745
		min_rx_space >>= 10;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   746
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   747
		/* If current Tx allocation is less than the min Tx FIFO size,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   748
		 * and the min Tx FIFO size is less than the current Rx FIFO
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   749
		 * allocation, take space away from current Rx allocation */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   750
		if (tx_space < min_tx_space &&
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   751
		    ((min_tx_space - tx_space) < pba)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   752
			pba = pba - (min_tx_space - tx_space);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   753
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   754
			/* PCI/PCIx hardware has PBA alignment constraints */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   755
			switch (adapter->hw.mac_type) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   756
			case e1000_82545 ... e1000_82546_rev_3:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   757
				pba &= ~(E1000_PBA_8K - 1);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   758
				break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   759
			default:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   760
				break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   761
			}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   762
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   763
			/* if short on rx space, rx wins and must trump tx
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   764
			 * adjustment or use Early Receive if available */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   765
			if (pba < min_rx_space) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   766
				switch (adapter->hw.mac_type) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   767
				case e1000_82573:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   768
					/* ERT enabled in e1000_configure_rx */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   769
					break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   770
				default:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   771
					pba = min_rx_space;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   772
					break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   773
				}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   774
			}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   775
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   776
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   777
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   778
	E1000_WRITE_REG(&adapter->hw, PBA, pba);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   779
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   780
	/* flow control settings */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   781
	/* Set the FC high water mark to 90% of the FIFO size.
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   782
	 * Required to clear last 3 LSB */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   783
	fc_high_water_mark = ((pba * 9216)/10) & 0xFFF8;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   784
	/* We can't use 90% on small FIFOs because the remainder
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   785
	 * would be less than 1 full frame.  In this case, we size
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   786
	 * it to allow at least a full frame above the high water
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   787
	 *  mark. */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   788
	if (pba < E1000_PBA_16K)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   789
		fc_high_water_mark = (pba * 1024) - 1600;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   790
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   791
	adapter->hw.fc_high_water = fc_high_water_mark;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   792
	adapter->hw.fc_low_water = fc_high_water_mark - 8;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   793
	if (adapter->hw.mac_type == e1000_80003es2lan)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   794
		adapter->hw.fc_pause_time = 0xFFFF;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   795
	else
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   796
		adapter->hw.fc_pause_time = E1000_FC_PAUSE_TIME;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   797
	adapter->hw.fc_send_xon = 1;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   798
	adapter->hw.fc = adapter->hw.original_fc;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   799
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   800
	/* Allow time for pending master requests to run */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   801
	e1000_reset_hw(&adapter->hw);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   802
	if (adapter->hw.mac_type >= e1000_82544)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   803
		E1000_WRITE_REG(&adapter->hw, WUC, 0);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   804
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   805
	if (e1000_init_hw(&adapter->hw))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   806
		DPRINTK(PROBE, ERR, "Hardware Error\n");
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   807
	e1000_update_mng_vlan(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   808
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   809
	/* if (adapter->hwflags & HWFLAGS_PHY_PWR_BIT) { */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   810
	if (adapter->hw.mac_type >= e1000_82544 &&
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   811
	    adapter->hw.mac_type <= e1000_82547_rev_2 &&
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   812
	    adapter->hw.autoneg == 1 &&
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   813
	    adapter->hw.autoneg_advertised == ADVERTISE_1000_FULL) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   814
		uint32_t ctrl = E1000_READ_REG(&adapter->hw, CTRL);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   815
		/* clear phy power management bit if we are in gig only mode,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   816
		 * which if enabled will attempt negotiation to 100Mb, which
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   817
		 * can cause a loss of link at power off or driver unload */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   818
		ctrl &= ~E1000_CTRL_SWDPIN3;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   819
		E1000_WRITE_REG(&adapter->hw, CTRL, ctrl);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   820
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   821
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   822
	/* Enable h/w to recognize an 802.1Q VLAN Ethernet packet */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   823
	E1000_WRITE_REG(&adapter->hw, VET, ETHERNET_IEEE_VLAN_TYPE);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   824
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   825
	e1000_reset_adaptive(&adapter->hw);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   826
	e1000_phy_get_info(&adapter->hw, &adapter->phy_info);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   827
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   828
	if (!adapter->smart_power_down &&
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   829
	    (adapter->hw.mac_type == e1000_82571 ||
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   830
	     adapter->hw.mac_type == e1000_82572)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   831
		uint16_t phy_data = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   832
		/* speed up time to link by disabling smart power down, ignore
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   833
		 * the return value of this function because there is nothing
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   834
		 * different we would do if it failed */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   835
		e1000_read_phy_reg(&adapter->hw, IGP02E1000_PHY_POWER_MGMT,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   836
		                   &phy_data);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   837
		phy_data &= ~IGP02E1000_PM_SPD;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   838
		e1000_write_phy_reg(&adapter->hw, IGP02E1000_PHY_POWER_MGMT,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   839
		                    phy_data);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   840
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   841
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   842
	e1000_release_manageability(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   843
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   844
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   845
/**
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   846
 * e1000_probe - Device Initialization Routine
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   847
 * @pdev: PCI device information struct
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   848
 * @ent: entry in e1000_pci_tbl
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   849
 *
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   850
 * Returns 0 on success, negative on failure
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   851
 *
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   852
 * e1000_probe initializes an adapter identified by a pci_dev structure.
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   853
 * The OS initialization, configuring of the adapter private structure,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   854
 * and a hardware reset occur.
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   855
 **/
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   856
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   857
static int __devinit
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   858
e1000_probe(struct pci_dev *pdev,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   859
            const struct pci_device_id *ent)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   860
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   861
	struct net_device *netdev;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   862
	struct e1000_adapter *adapter;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   863
	unsigned long mmio_start, mmio_len;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   864
	unsigned long flash_start, flash_len;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   865
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   866
	static int cards_found = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   867
	static int global_quad_port_a = 0; /* global ksp3 port a indication */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   868
	int i, err, pci_using_dac;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   869
	uint16_t eeprom_data = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   870
	uint16_t eeprom_apme_mask = E1000_EEPROM_APME;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   871
	if ((err = pci_enable_device(pdev)))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   872
		return err;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   873
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   874
	if (!(err = pci_set_dma_mask(pdev, DMA_64BIT_MASK)) &&
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   875
	    !(err = pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK))) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   876
		pci_using_dac = 1;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   877
	} else {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   878
		if ((err = pci_set_dma_mask(pdev, DMA_32BIT_MASK)) &&
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   879
		    (err = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK))) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   880
			E1000_ERR("No usable DMA configuration, aborting\n");
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   881
			goto err_dma;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   882
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   883
		pci_using_dac = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   884
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   885
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   886
	if ((err = pci_request_regions(pdev, e1000_driver_name)))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   887
		goto err_pci_reg;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   888
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   889
	pci_set_master(pdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   890
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   891
	err = -ENOMEM;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   892
	netdev = alloc_etherdev(sizeof(struct e1000_adapter));
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   893
	if (!netdev)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   894
		goto err_alloc_etherdev;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   895
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   896
	SET_MODULE_OWNER(netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   897
	SET_NETDEV_DEV(netdev, &pdev->dev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   898
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   899
	pci_set_drvdata(pdev, netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   900
	adapter = netdev_priv(netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   901
	adapter->netdev = netdev;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   902
	adapter->pdev = pdev;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   903
	adapter->hw.back = adapter;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   904
	adapter->msg_enable = (1 << debug) - 1;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   905
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   906
	mmio_start = pci_resource_start(pdev, BAR_0);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   907
	mmio_len = pci_resource_len(pdev, BAR_0);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   908
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   909
	err = -EIO;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   910
	adapter->hw.hw_addr = ioremap(mmio_start, mmio_len);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   911
	if (!adapter->hw.hw_addr)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   912
		goto err_ioremap;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   913
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   914
	for (i = BAR_1; i <= BAR_5; i++) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   915
		if (pci_resource_len(pdev, i) == 0)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   916
			continue;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   917
		if (pci_resource_flags(pdev, i) & IORESOURCE_IO) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   918
			adapter->hw.io_base = pci_resource_start(pdev, i);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   919
			break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   920
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   921
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   922
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   923
	netdev->open = &e1000_open;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   924
	netdev->stop = &e1000_close;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   925
	netdev->hard_start_xmit = &e1000_xmit_frame;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   926
	netdev->get_stats = &e1000_get_stats;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   927
	netdev->set_multicast_list = &e1000_set_multi;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   928
	netdev->set_mac_address = &e1000_set_mac;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   929
	netdev->change_mtu = &e1000_change_mtu;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   930
	netdev->do_ioctl = &e1000_ioctl;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   931
	e1000_set_ethtool_ops(netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   932
	netdev->tx_timeout = &e1000_tx_timeout;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   933
	netdev->watchdog_timeo = 5 * HZ;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   934
#ifdef CONFIG_E1000_NAPI
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   935
	netdev->poll = &e1000_clean;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   936
	netdev->weight = 64;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   937
#endif
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   938
	netdev->vlan_rx_register = e1000_vlan_rx_register;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   939
	netdev->vlan_rx_add_vid = e1000_vlan_rx_add_vid;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   940
	netdev->vlan_rx_kill_vid = e1000_vlan_rx_kill_vid;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   941
#ifdef CONFIG_NET_POLL_CONTROLLER
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   942
	netdev->poll_controller = e1000_netpoll;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   943
#endif
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   944
	strncpy(netdev->name, pci_name(pdev), sizeof(netdev->name) - 1);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   945
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   946
	netdev->mem_start = mmio_start;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   947
	netdev->mem_end = mmio_start + mmio_len;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   948
	netdev->base_addr = adapter->hw.io_base;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   949
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   950
	adapter->bd_number = cards_found;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   951
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   952
	/* setup the private structure */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   953
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   954
	if ((err = e1000_sw_init(adapter)))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   955
		goto err_sw_init;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   956
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   957
	err = -EIO;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   958
	/* Flash BAR mapping must happen after e1000_sw_init
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   959
	 * because it depends on mac_type */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   960
	if ((adapter->hw.mac_type == e1000_ich8lan) &&
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   961
	   (pci_resource_flags(pdev, 1) & IORESOURCE_MEM)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   962
		flash_start = pci_resource_start(pdev, 1);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   963
		flash_len = pci_resource_len(pdev, 1);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   964
		adapter->hw.flash_address = ioremap(flash_start, flash_len);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   965
		if (!adapter->hw.flash_address)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   966
			goto err_flashmap;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   967
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   968
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   969
	if (e1000_check_phy_reset_block(&adapter->hw))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   970
		DPRINTK(PROBE, INFO, "PHY reset is blocked due to SOL/IDER session.\n");
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   971
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   972
	if (adapter->hw.mac_type >= e1000_82543) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   973
		netdev->features = NETIF_F_SG |
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   974
				   NETIF_F_HW_CSUM |
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   975
				   NETIF_F_HW_VLAN_TX |
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   976
				   NETIF_F_HW_VLAN_RX |
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   977
				   NETIF_F_HW_VLAN_FILTER;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   978
		if (adapter->hw.mac_type == e1000_ich8lan)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   979
			netdev->features &= ~NETIF_F_HW_VLAN_FILTER;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   980
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   981
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   982
	if ((adapter->hw.mac_type >= e1000_82544) &&
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   983
	   (adapter->hw.mac_type != e1000_82547))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   984
		netdev->features |= NETIF_F_TSO;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   985
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   986
	if (adapter->hw.mac_type > e1000_82547_rev_2)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   987
		netdev->features |= NETIF_F_TSO6;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   988
	if (pci_using_dac)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   989
		netdev->features |= NETIF_F_HIGHDMA;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   990
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   991
	netdev->features |= NETIF_F_LLTX;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   992
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   993
	adapter->en_mng_pt = e1000_enable_mng_pass_thru(&adapter->hw);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   994
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   995
	/* initialize eeprom parameters */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   996
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   997
	if (e1000_init_eeprom_params(&adapter->hw)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   998
		E1000_ERR("EEPROM initialization failed\n");
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   999
		goto err_eeprom;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1000
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1001
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1002
	/* before reading the EEPROM, reset the controller to
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1003
	 * put the device in a known good starting state */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1004
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1005
	e1000_reset_hw(&adapter->hw);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1006
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1007
	/* make sure the EEPROM is good */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1008
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1009
	if (e1000_validate_eeprom_checksum(&adapter->hw) < 0) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1010
		DPRINTK(PROBE, ERR, "The EEPROM Checksum Is Not Valid\n");
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1011
		goto err_eeprom;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1012
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1013
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1014
	/* copy the MAC address out of the EEPROM */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1015
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1016
	if (e1000_read_mac_addr(&adapter->hw))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1017
		DPRINTK(PROBE, ERR, "EEPROM Read Error\n");
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1018
	memcpy(netdev->dev_addr, adapter->hw.mac_addr, netdev->addr_len);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1019
	memcpy(netdev->perm_addr, adapter->hw.mac_addr, netdev->addr_len);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1020
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1021
	if (!is_valid_ether_addr(netdev->perm_addr)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1022
		DPRINTK(PROBE, ERR, "Invalid MAC Address\n");
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1023
		goto err_eeprom;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1024
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1025
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1026
	e1000_get_bus_info(&adapter->hw);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1027
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1028
	init_timer(&adapter->tx_fifo_stall_timer);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1029
	adapter->tx_fifo_stall_timer.function = &e1000_82547_tx_fifo_stall;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1030
	adapter->tx_fifo_stall_timer.data = (unsigned long) adapter;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1031
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1032
	init_timer(&adapter->watchdog_timer);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1033
	adapter->watchdog_timer.function = &e1000_watchdog;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1034
	adapter->watchdog_timer.data = (unsigned long) adapter;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1035
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1036
	init_timer(&adapter->phy_info_timer);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1037
	adapter->phy_info_timer.function = &e1000_update_phy_info;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1038
	adapter->phy_info_timer.data = (unsigned long) adapter;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1039
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1040
	INIT_WORK(&adapter->reset_task, e1000_reset_task);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1041
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1042
	e1000_check_options(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1043
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1044
	/* Initial Wake on LAN setting
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1045
	 * If APM wake is enabled in the EEPROM,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1046
	 * enable the ACPI Magic Packet filter
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1047
	 */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1048
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1049
	switch (adapter->hw.mac_type) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1050
	case e1000_82542_rev2_0:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1051
	case e1000_82542_rev2_1:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1052
	case e1000_82543:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1053
		break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1054
	case e1000_82544:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1055
		e1000_read_eeprom(&adapter->hw,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1056
			EEPROM_INIT_CONTROL2_REG, 1, &eeprom_data);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1057
		eeprom_apme_mask = E1000_EEPROM_82544_APM;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1058
		break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1059
	case e1000_ich8lan:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1060
		e1000_read_eeprom(&adapter->hw,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1061
			EEPROM_INIT_CONTROL1_REG, 1, &eeprom_data);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1062
		eeprom_apme_mask = E1000_EEPROM_ICH8_APME;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1063
		break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1064
	case e1000_82546:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1065
	case e1000_82546_rev_3:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1066
	case e1000_82571:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1067
	case e1000_80003es2lan:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1068
		if (E1000_READ_REG(&adapter->hw, STATUS) & E1000_STATUS_FUNC_1){
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1069
			e1000_read_eeprom(&adapter->hw,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1070
				EEPROM_INIT_CONTROL3_PORT_B, 1, &eeprom_data);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1071
			break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1072
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1073
		/* Fall Through */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1074
	default:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1075
		e1000_read_eeprom(&adapter->hw,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1076
			EEPROM_INIT_CONTROL3_PORT_A, 1, &eeprom_data);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1077
		break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1078
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1079
	if (eeprom_data & eeprom_apme_mask)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1080
		adapter->eeprom_wol |= E1000_WUFC_MAG;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1081
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1082
	/* now that we have the eeprom settings, apply the special cases
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1083
	 * where the eeprom may be wrong or the board simply won't support
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1084
	 * wake on lan on a particular port */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1085
	switch (pdev->device) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1086
	case E1000_DEV_ID_82546GB_PCIE:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1087
		adapter->eeprom_wol = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1088
		break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1089
	case E1000_DEV_ID_82546EB_FIBER:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1090
	case E1000_DEV_ID_82546GB_FIBER:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1091
	case E1000_DEV_ID_82571EB_FIBER:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1092
		/* Wake events only supported on port A for dual fiber
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1093
		 * regardless of eeprom setting */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1094
		if (E1000_READ_REG(&adapter->hw, STATUS) & E1000_STATUS_FUNC_1)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1095
			adapter->eeprom_wol = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1096
		break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1097
	case E1000_DEV_ID_82546GB_QUAD_COPPER_KSP3:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1098
	case E1000_DEV_ID_82571EB_QUAD_COPPER:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1099
	case E1000_DEV_ID_82571EB_QUAD_COPPER_LOWPROFILE:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1100
		/* if quad port adapter, disable WoL on all but port A */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1101
		if (global_quad_port_a != 0)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1102
			adapter->eeprom_wol = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1103
		else
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1104
			adapter->quad_port_a = 1;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1105
		/* Reset for multiple quad port adapters */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1106
		if (++global_quad_port_a == 4)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1107
			global_quad_port_a = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1108
		break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1109
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1110
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1111
	/* initialize the wol settings based on the eeprom settings */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1112
	adapter->wol = adapter->eeprom_wol;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1113
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1114
	/* print bus type/speed/width info */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1115
	{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1116
	struct e1000_hw *hw = &adapter->hw;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1117
	DPRINTK(PROBE, INFO, "(PCI%s:%s:%s) ",
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1118
		((hw->bus_type == e1000_bus_type_pcix) ? "-X" :
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1119
		 (hw->bus_type == e1000_bus_type_pci_express ? " Express":"")),
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1120
		((hw->bus_speed == e1000_bus_speed_2500) ? "2.5Gb/s" :
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1121
		 (hw->bus_speed == e1000_bus_speed_133) ? "133MHz" :
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1122
		 (hw->bus_speed == e1000_bus_speed_120) ? "120MHz" :
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1123
		 (hw->bus_speed == e1000_bus_speed_100) ? "100MHz" :
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1124
		 (hw->bus_speed == e1000_bus_speed_66) ? "66MHz" : "33MHz"),
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1125
		((hw->bus_width == e1000_bus_width_64) ? "64-bit" :
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1126
		 (hw->bus_width == e1000_bus_width_pciex_4) ? "Width x4" :
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1127
		 (hw->bus_width == e1000_bus_width_pciex_1) ? "Width x1" :
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1128
		 "32-bit"));
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1129
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1130
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1131
	for (i = 0; i < 6; i++)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1132
		printk("%2.2x%c", netdev->dev_addr[i], i == 5 ? '\n' : ':');
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1133
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1134
	/* reset the hardware with the new settings */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1135
	e1000_reset(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1136
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1137
	/* If the controller is 82573 and f/w is AMT, do not set
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1138
	 * DRV_LOAD until the interface is up.  For all other cases,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1139
	 * let the f/w know that the h/w is now under the control
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1140
	 * of the driver. */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1141
	if (adapter->hw.mac_type != e1000_82573 ||
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1142
	    !e1000_check_mng_mode(&adapter->hw))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1143
		e1000_get_hw_control(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1144
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1145
	/* tell the stack to leave us alone until e1000_open() is called */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1146
	netif_carrier_off(netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1147
	netif_stop_queue(netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1148
#ifdef CONFIG_E1000_NAPI
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1149
	netif_poll_disable(netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1150
#endif
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1151
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1152
	strcpy(netdev->name, "eth%d");
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1153
	if ((err = register_netdev(netdev)))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1154
		goto err_register;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1155
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1156
	DPRINTK(PROBE, INFO, "Intel(R) PRO/1000 Network Connection\n");
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1157
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1158
	cards_found++;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1159
	return 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1160
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1161
err_register:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1162
	e1000_release_hw_control(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1163
err_eeprom:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1164
	if (!e1000_check_phy_reset_block(&adapter->hw))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1165
		e1000_phy_hw_reset(&adapter->hw);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1166
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1167
	if (adapter->hw.flash_address)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1168
		iounmap(adapter->hw.flash_address);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1169
err_flashmap:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1170
#ifdef CONFIG_E1000_NAPI
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1171
	for (i = 0; i < adapter->num_rx_queues; i++)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1172
		dev_put(&adapter->polling_netdev[i]);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1173
#endif
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1174
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1175
	kfree(adapter->tx_ring);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1176
	kfree(adapter->rx_ring);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1177
#ifdef CONFIG_E1000_NAPI
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1178
	kfree(adapter->polling_netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1179
#endif
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1180
err_sw_init:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1181
	iounmap(adapter->hw.hw_addr);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1182
err_ioremap:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1183
	free_netdev(netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1184
err_alloc_etherdev:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1185
	pci_release_regions(pdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1186
err_pci_reg:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1187
err_dma:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1188
	pci_disable_device(pdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1189
	return err;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1190
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1191
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1192
/**
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1193
 * e1000_remove - Device Removal Routine
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1194
 * @pdev: PCI device information struct
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1195
 *
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1196
 * e1000_remove is called by the PCI subsystem to alert the driver
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1197
 * that it should release a PCI device.  The could be caused by a
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1198
 * Hot-Plug event, or because the driver is going to be removed from
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1199
 * memory.
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1200
 **/
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1201
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1202
static void __devexit
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1203
e1000_remove(struct pci_dev *pdev)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1204
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1205
	struct net_device *netdev = pci_get_drvdata(pdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1206
	struct e1000_adapter *adapter = netdev_priv(netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1207
#ifdef CONFIG_E1000_NAPI
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1208
	int i;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1209
#endif
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1210
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1211
	cancel_work_sync(&adapter->reset_task);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1212
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1213
	e1000_release_manageability(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1214
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1215
	/* Release control of h/w to f/w.  If f/w is AMT enabled, this
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1216
	 * would have already happened in close and is redundant. */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1217
	e1000_release_hw_control(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1218
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1219
	unregister_netdev(netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1220
#ifdef CONFIG_E1000_NAPI
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1221
	for (i = 0; i < adapter->num_rx_queues; i++)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1222
		dev_put(&adapter->polling_netdev[i]);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1223
#endif
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1224
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1225
	if (!e1000_check_phy_reset_block(&adapter->hw))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1226
		e1000_phy_hw_reset(&adapter->hw);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1227
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1228
	kfree(adapter->tx_ring);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1229
	kfree(adapter->rx_ring);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1230
#ifdef CONFIG_E1000_NAPI
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1231
	kfree(adapter->polling_netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1232
#endif
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1233
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1234
	iounmap(adapter->hw.hw_addr);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1235
	if (adapter->hw.flash_address)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1236
		iounmap(adapter->hw.flash_address);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1237
	pci_release_regions(pdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1238
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1239
	free_netdev(netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1240
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1241
	pci_disable_device(pdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1242
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1243
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1244
/**
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1245
 * e1000_sw_init - Initialize general software structures (struct e1000_adapter)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1246
 * @adapter: board private structure to initialize
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1247
 *
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1248
 * e1000_sw_init initializes the Adapter private data structure.
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1249
 * Fields are initialized based on PCI device information and
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1250
 * OS network device settings (MTU size).
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1251
 **/
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1252
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1253
static int __devinit
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1254
e1000_sw_init(struct e1000_adapter *adapter)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1255
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1256
	struct e1000_hw *hw = &adapter->hw;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1257
	struct net_device *netdev = adapter->netdev;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1258
	struct pci_dev *pdev = adapter->pdev;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1259
#ifdef CONFIG_E1000_NAPI
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1260
	int i;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1261
#endif
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1262
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1263
	/* PCI config space info */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1264
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1265
	hw->vendor_id = pdev->vendor;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1266
	hw->device_id = pdev->device;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1267
	hw->subsystem_vendor_id = pdev->subsystem_vendor;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1268
	hw->subsystem_id = pdev->subsystem_device;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1269
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1270
	pci_read_config_byte(pdev, PCI_REVISION_ID, &hw->revision_id);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1271
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1272
	pci_read_config_word(pdev, PCI_COMMAND, &hw->pci_cmd_word);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1273
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1274
	adapter->rx_buffer_len = MAXIMUM_ETHERNET_VLAN_SIZE;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1275
	adapter->rx_ps_bsize0 = E1000_RXBUFFER_128;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1276
	hw->max_frame_size = netdev->mtu +
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1277
			     ENET_HEADER_SIZE + ETHERNET_FCS_SIZE;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1278
	hw->min_frame_size = MINIMUM_ETHERNET_FRAME_SIZE;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1279
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1280
	/* identify the MAC */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1281
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1282
	if (e1000_set_mac_type(hw)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1283
		DPRINTK(PROBE, ERR, "Unknown MAC Type\n");
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1284
		return -EIO;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1285
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1286
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1287
	switch (hw->mac_type) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1288
	default:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1289
		break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1290
	case e1000_82541:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1291
	case e1000_82547:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1292
	case e1000_82541_rev_2:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1293
	case e1000_82547_rev_2:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1294
		hw->phy_init_script = 1;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1295
		break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1296
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1297
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1298
	e1000_set_media_type(hw);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1299
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1300
	hw->wait_autoneg_complete = FALSE;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1301
	hw->tbi_compatibility_en = TRUE;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1302
	hw->adaptive_ifs = TRUE;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1303
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1304
	/* Copper options */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1305
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1306
	if (hw->media_type == e1000_media_type_copper) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1307
		hw->mdix = AUTO_ALL_MODES;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1308
		hw->disable_polarity_correction = FALSE;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1309
		hw->master_slave = E1000_MASTER_SLAVE;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1310
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1311
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1312
	adapter->num_tx_queues = 1;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1313
	adapter->num_rx_queues = 1;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1314
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1315
	if (e1000_alloc_queues(adapter)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1316
		DPRINTK(PROBE, ERR, "Unable to allocate memory for queues\n");
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1317
		return -ENOMEM;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1318
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1319
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1320
#ifdef CONFIG_E1000_NAPI
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1321
	for (i = 0; i < adapter->num_rx_queues; i++) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1322
		adapter->polling_netdev[i].priv = adapter;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1323
		adapter->polling_netdev[i].poll = &e1000_clean;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1324
		adapter->polling_netdev[i].weight = 64;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1325
		dev_hold(&adapter->polling_netdev[i]);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1326
		set_bit(__LINK_STATE_START, &adapter->polling_netdev[i].state);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1327
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1328
	spin_lock_init(&adapter->tx_queue_lock);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1329
#endif
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1330
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1331
	/* Explicitly disable IRQ since the NIC can be in any state. */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1332
	atomic_set(&adapter->irq_sem, 0);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1333
	e1000_irq_disable(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1334
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1335
	spin_lock_init(&adapter->stats_lock);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1336
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1337
	set_bit(__E1000_DOWN, &adapter->flags);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1338
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1339
	return 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1340
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1341
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1342
/**
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1343
 * e1000_alloc_queues - Allocate memory for all rings
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1344
 * @adapter: board private structure to initialize
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1345
 *
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1346
 * We allocate one ring per queue at run-time since we don't know the
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1347
 * number of queues at compile-time.  The polling_netdev array is
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1348
 * intended for Multiqueue, but should work fine with a single queue.
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1349
 **/
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1350
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1351
static int __devinit
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1352
e1000_alloc_queues(struct e1000_adapter *adapter)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1353
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1354
	adapter->tx_ring = kcalloc(adapter->num_tx_queues,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1355
	                           sizeof(struct e1000_tx_ring), GFP_KERNEL);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1356
	if (!adapter->tx_ring)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1357
		return -ENOMEM;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1358
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1359
	adapter->rx_ring = kcalloc(adapter->num_rx_queues,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1360
	                           sizeof(struct e1000_rx_ring), GFP_KERNEL);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1361
	if (!adapter->rx_ring) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1362
		kfree(adapter->tx_ring);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1363
		return -ENOMEM;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1364
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1365
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1366
#ifdef CONFIG_E1000_NAPI
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1367
	adapter->polling_netdev = kcalloc(adapter->num_rx_queues,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1368
	                                  sizeof(struct net_device),
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1369
	                                  GFP_KERNEL);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1370
	if (!adapter->polling_netdev) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1371
		kfree(adapter->tx_ring);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1372
		kfree(adapter->rx_ring);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1373
		return -ENOMEM;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1374
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1375
#endif
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1376
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1377
	return E1000_SUCCESS;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1378
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1379
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1380
/**
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1381
 * e1000_open - Called when a network interface is made active
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1382
 * @netdev: network interface device structure
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1383
 *
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1384
 * Returns 0 on success, negative value on failure
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1385
 *
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1386
 * The open entry point is called when a network interface is made
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1387
 * active by the system (IFF_UP).  At this point all resources needed
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1388
 * for transmit and receive operations are allocated, the interrupt
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1389
 * handler is registered with the OS, the watchdog timer is started,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1390
 * and the stack is notified that the interface is ready.
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1391
 **/
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1392
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1393
static int
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1394
e1000_open(struct net_device *netdev)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1395
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1396
	struct e1000_adapter *adapter = netdev_priv(netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1397
	int err;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1398
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1399
	/* disallow open during test */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1400
	if (test_bit(__E1000_TESTING, &adapter->flags))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1401
		return -EBUSY;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1402
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1403
	/* allocate transmit descriptors */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1404
	err = e1000_setup_all_tx_resources(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1405
	if (err)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1406
		goto err_setup_tx;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1407
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1408
	/* allocate receive descriptors */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1409
	err = e1000_setup_all_rx_resources(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1410
	if (err)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1411
		goto err_setup_rx;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1412
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1413
	e1000_power_up_phy(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1414
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1415
	adapter->mng_vlan_id = E1000_MNG_VLAN_NONE;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1416
	if ((adapter->hw.mng_cookie.status &
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1417
			  E1000_MNG_DHCP_COOKIE_STATUS_VLAN_SUPPORT)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1418
		e1000_update_mng_vlan(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1419
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1420
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1421
	/* If AMT is enabled, let the firmware know that the network
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1422
	 * interface is now open */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1423
	if (adapter->hw.mac_type == e1000_82573 &&
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1424
	    e1000_check_mng_mode(&adapter->hw))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1425
		e1000_get_hw_control(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1426
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1427
	/* before we allocate an interrupt, we must be ready to handle it.
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1428
	 * Setting DEBUG_SHIRQ in the kernel makes it fire an interrupt
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1429
	 * as soon as we call pci_request_irq, so we have to setup our
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1430
	 * clean_rx handler before we do so.  */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1431
	e1000_configure(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1432
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1433
	err = e1000_request_irq(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1434
	if (err)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1435
		goto err_req_irq;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1436
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1437
	/* From here on the code is the same as e1000_up() */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1438
	clear_bit(__E1000_DOWN, &adapter->flags);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1439
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1440
#ifdef CONFIG_E1000_NAPI
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1441
	netif_poll_enable(netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1442
#endif
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1443
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1444
	e1000_irq_enable(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1445
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1446
	/* fire a link status change interrupt to start the watchdog */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1447
	E1000_WRITE_REG(&adapter->hw, ICS, E1000_ICS_LSC);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1448
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1449
	return E1000_SUCCESS;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1450
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1451
err_req_irq:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1452
	e1000_release_hw_control(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1453
	e1000_power_down_phy(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1454
	e1000_free_all_rx_resources(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1455
err_setup_rx:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1456
	e1000_free_all_tx_resources(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1457
err_setup_tx:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1458
	e1000_reset(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1459
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1460
	return err;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1461
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1462
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1463
/**
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1464
 * e1000_close - Disables a network interface
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1465
 * @netdev: network interface device structure
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1466
 *
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1467
 * Returns 0, this is not allowed to fail
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1468
 *
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1469
 * The close entry point is called when an interface is de-activated
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1470
 * by the OS.  The hardware is still under the drivers control, but
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1471
 * needs to be disabled.  A global MAC reset is issued to stop the
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1472
 * hardware, and all transmit and receive resources are freed.
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1473
 **/
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1474
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1475
static int
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1476
e1000_close(struct net_device *netdev)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1477
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1478
	struct e1000_adapter *adapter = netdev_priv(netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1479
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1480
	WARN_ON(test_bit(__E1000_RESETTING, &adapter->flags));
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1481
	e1000_down(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1482
	e1000_power_down_phy(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1483
	e1000_free_irq(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1484
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1485
	e1000_free_all_tx_resources(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1486
	e1000_free_all_rx_resources(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1487
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1488
	/* kill manageability vlan ID if supported, but not if a vlan with
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1489
	 * the same ID is registered on the host OS (let 8021q kill it) */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1490
	if ((adapter->hw.mng_cookie.status &
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1491
			  E1000_MNG_DHCP_COOKIE_STATUS_VLAN_SUPPORT) &&
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1492
	     !(adapter->vlgrp &&
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1493
	       vlan_group_get_device(adapter->vlgrp, adapter->mng_vlan_id))) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1494
		e1000_vlan_rx_kill_vid(netdev, adapter->mng_vlan_id);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1495
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1496
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1497
	/* If AMT is enabled, let the firmware know that the network
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1498
	 * interface is now closed */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1499
	if (adapter->hw.mac_type == e1000_82573 &&
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1500
	    e1000_check_mng_mode(&adapter->hw))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1501
		e1000_release_hw_control(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1502
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1503
	return 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1504
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1505
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1506
/**
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1507
 * e1000_check_64k_bound - check that memory doesn't cross 64kB boundary
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1508
 * @adapter: address of board private structure
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1509
 * @start: address of beginning of memory
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1510
 * @len: length of memory
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1511
 **/
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1512
static boolean_t
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1513
e1000_check_64k_bound(struct e1000_adapter *adapter,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1514
		      void *start, unsigned long len)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1515
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1516
	unsigned long begin = (unsigned long) start;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1517
	unsigned long end = begin + len;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1518
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1519
	/* First rev 82545 and 82546 need to not allow any memory
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1520
	 * write location to cross 64k boundary due to errata 23 */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1521
	if (adapter->hw.mac_type == e1000_82545 ||
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1522
	    adapter->hw.mac_type == e1000_82546) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1523
		return ((begin ^ (end - 1)) >> 16) != 0 ? FALSE : TRUE;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1524
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1525
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1526
	return TRUE;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1527
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1528
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1529
/**
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1530
 * e1000_setup_tx_resources - allocate Tx resources (Descriptors)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1531
 * @adapter: board private structure
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1532
 * @txdr:    tx descriptor ring (for a specific queue) to setup
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1533
 *
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1534
 * Return 0 on success, negative on failure
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1535
 **/
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1536
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1537
static int
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1538
e1000_setup_tx_resources(struct e1000_adapter *adapter,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1539
                         struct e1000_tx_ring *txdr)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1540
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1541
	struct pci_dev *pdev = adapter->pdev;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1542
	int size;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1543
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1544
	size = sizeof(struct e1000_buffer) * txdr->count;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1545
	txdr->buffer_info = vmalloc(size);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1546
	if (!txdr->buffer_info) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1547
		DPRINTK(PROBE, ERR,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1548
		"Unable to allocate memory for the transmit descriptor ring\n");
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1549
		return -ENOMEM;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1550
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1551
	memset(txdr->buffer_info, 0, size);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1552
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1553
	/* round up to nearest 4K */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1554
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1555
	txdr->size = txdr->count * sizeof(struct e1000_tx_desc);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1556
	txdr->size = ALIGN(txdr->size, 4096);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1557
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1558
	txdr->desc = pci_alloc_consistent(pdev, txdr->size, &txdr->dma);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1559
	if (!txdr->desc) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1560
setup_tx_desc_die:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1561
		vfree(txdr->buffer_info);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1562
		DPRINTK(PROBE, ERR,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1563
		"Unable to allocate memory for the transmit descriptor ring\n");
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1564
		return -ENOMEM;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1565
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1566
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1567
	/* Fix for errata 23, can't cross 64kB boundary */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1568
	if (!e1000_check_64k_bound(adapter, txdr->desc, txdr->size)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1569
		void *olddesc = txdr->desc;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1570
		dma_addr_t olddma = txdr->dma;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1571
		DPRINTK(TX_ERR, ERR, "txdr align check failed: %u bytes "
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1572
				     "at %p\n", txdr->size, txdr->desc);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1573
		/* Try again, without freeing the previous */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1574
		txdr->desc = pci_alloc_consistent(pdev, txdr->size, &txdr->dma);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1575
		/* Failed allocation, critical failure */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1576
		if (!txdr->desc) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1577
			pci_free_consistent(pdev, txdr->size, olddesc, olddma);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1578
			goto setup_tx_desc_die;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1579
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1580
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1581
		if (!e1000_check_64k_bound(adapter, txdr->desc, txdr->size)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1582
			/* give up */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1583
			pci_free_consistent(pdev, txdr->size, txdr->desc,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1584
					    txdr->dma);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1585
			pci_free_consistent(pdev, txdr->size, olddesc, olddma);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1586
			DPRINTK(PROBE, ERR,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1587
				"Unable to allocate aligned memory "
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1588
				"for the transmit descriptor ring\n");
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1589
			vfree(txdr->buffer_info);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1590
			return -ENOMEM;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1591
		} else {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1592
			/* Free old allocation, new allocation was successful */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1593
			pci_free_consistent(pdev, txdr->size, olddesc, olddma);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1594
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1595
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1596
	memset(txdr->desc, 0, txdr->size);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1597
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1598
	txdr->next_to_use = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1599
	txdr->next_to_clean = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1600
	spin_lock_init(&txdr->tx_lock);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1601
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1602
	return 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1603
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1604
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1605
/**
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1606
 * e1000_setup_all_tx_resources - wrapper to allocate Tx resources
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1607
 * 				  (Descriptors) for all queues
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1608
 * @adapter: board private structure
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1609
 *
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1610
 * Return 0 on success, negative on failure
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1611
 **/
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1612
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1613
int
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1614
e1000_setup_all_tx_resources(struct e1000_adapter *adapter)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1615
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1616
	int i, err = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1617
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1618
	for (i = 0; i < adapter->num_tx_queues; i++) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1619
		err = e1000_setup_tx_resources(adapter, &adapter->tx_ring[i]);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1620
		if (err) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1621
			DPRINTK(PROBE, ERR,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1622
				"Allocation for Tx Queue %u failed\n", i);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1623
			for (i-- ; i >= 0; i--)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1624
				e1000_free_tx_resources(adapter,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1625
							&adapter->tx_ring[i]);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1626
			break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1627
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1628
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1629
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1630
	return err;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1631
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1632
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1633
/**
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1634
 * e1000_configure_tx - Configure 8254x Transmit Unit after Reset
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1635
 * @adapter: board private structure
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1636
 *
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1637
 * Configure the Tx unit of the MAC after a reset.
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1638
 **/
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1639
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1640
static void
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1641
e1000_configure_tx(struct e1000_adapter *adapter)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1642
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1643
	uint64_t tdba;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1644
	struct e1000_hw *hw = &adapter->hw;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1645
	uint32_t tdlen, tctl, tipg, tarc;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1646
	uint32_t ipgr1, ipgr2;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1647
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1648
	/* Setup the HW Tx Head and Tail descriptor pointers */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1649
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1650
	switch (adapter->num_tx_queues) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1651
	case 1:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1652
	default:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1653
		tdba = adapter->tx_ring[0].dma;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1654
		tdlen = adapter->tx_ring[0].count *
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1655
			sizeof(struct e1000_tx_desc);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1656
		E1000_WRITE_REG(hw, TDLEN, tdlen);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1657
		E1000_WRITE_REG(hw, TDBAH, (tdba >> 32));
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1658
		E1000_WRITE_REG(hw, TDBAL, (tdba & 0x00000000ffffffffULL));
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1659
		E1000_WRITE_REG(hw, TDT, 0);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1660
		E1000_WRITE_REG(hw, TDH, 0);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1661
		adapter->tx_ring[0].tdh = ((hw->mac_type >= e1000_82543) ? E1000_TDH : E1000_82542_TDH);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1662
		adapter->tx_ring[0].tdt = ((hw->mac_type >= e1000_82543) ? E1000_TDT : E1000_82542_TDT);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1663
		break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1664
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1665
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1666
	/* Set the default values for the Tx Inter Packet Gap timer */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1667
	if (adapter->hw.mac_type <= e1000_82547_rev_2 &&
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1668
	    (hw->media_type == e1000_media_type_fiber ||
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1669
	     hw->media_type == e1000_media_type_internal_serdes))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1670
		tipg = DEFAULT_82543_TIPG_IPGT_FIBER;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1671
	else
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1672
		tipg = DEFAULT_82543_TIPG_IPGT_COPPER;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1673
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1674
	switch (hw->mac_type) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1675
	case e1000_82542_rev2_0:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1676
	case e1000_82542_rev2_1:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1677
		tipg = DEFAULT_82542_TIPG_IPGT;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1678
		ipgr1 = DEFAULT_82542_TIPG_IPGR1;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1679
		ipgr2 = DEFAULT_82542_TIPG_IPGR2;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1680
		break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1681
	case e1000_80003es2lan:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1682
		ipgr1 = DEFAULT_82543_TIPG_IPGR1;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1683
		ipgr2 = DEFAULT_80003ES2LAN_TIPG_IPGR2;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1684
		break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1685
	default:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1686
		ipgr1 = DEFAULT_82543_TIPG_IPGR1;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1687
		ipgr2 = DEFAULT_82543_TIPG_IPGR2;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1688
		break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1689
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1690
	tipg |= ipgr1 << E1000_TIPG_IPGR1_SHIFT;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1691
	tipg |= ipgr2 << E1000_TIPG_IPGR2_SHIFT;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1692
	E1000_WRITE_REG(hw, TIPG, tipg);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1693
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1694
	/* Set the Tx Interrupt Delay register */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1695
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1696
	E1000_WRITE_REG(hw, TIDV, adapter->tx_int_delay);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1697
	if (hw->mac_type >= e1000_82540)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1698
		E1000_WRITE_REG(hw, TADV, adapter->tx_abs_int_delay);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1699
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1700
	/* Program the Transmit Control Register */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1701
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1702
	tctl = E1000_READ_REG(hw, TCTL);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1703
	tctl &= ~E1000_TCTL_CT;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1704
	tctl |= E1000_TCTL_PSP | E1000_TCTL_RTLC |
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1705
		(E1000_COLLISION_THRESHOLD << E1000_CT_SHIFT);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1706
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1707
	if (hw->mac_type == e1000_82571 || hw->mac_type == e1000_82572) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1708
		tarc = E1000_READ_REG(hw, TARC0);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1709
		/* set the speed mode bit, we'll clear it if we're not at
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1710
		 * gigabit link later */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1711
		tarc |= (1 << 21);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1712
		E1000_WRITE_REG(hw, TARC0, tarc);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1713
	} else if (hw->mac_type == e1000_80003es2lan) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1714
		tarc = E1000_READ_REG(hw, TARC0);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1715
		tarc |= 1;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1716
		E1000_WRITE_REG(hw, TARC0, tarc);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1717
		tarc = E1000_READ_REG(hw, TARC1);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1718
		tarc |= 1;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1719
		E1000_WRITE_REG(hw, TARC1, tarc);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1720
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1721
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1722
	e1000_config_collision_dist(hw);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1723
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1724
	/* Setup Transmit Descriptor Settings for eop descriptor */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1725
	adapter->txd_cmd = E1000_TXD_CMD_EOP | E1000_TXD_CMD_IFCS;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1726
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1727
	/* only set IDE if we are delaying interrupts using the timers */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1728
	if (adapter->tx_int_delay)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1729
		adapter->txd_cmd |= E1000_TXD_CMD_IDE;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1730
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1731
	if (hw->mac_type < e1000_82543)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1732
		adapter->txd_cmd |= E1000_TXD_CMD_RPS;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1733
	else
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1734
		adapter->txd_cmd |= E1000_TXD_CMD_RS;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1735
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1736
	/* Cache if we're 82544 running in PCI-X because we'll
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1737
	 * need this to apply a workaround later in the send path. */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1738
	if (hw->mac_type == e1000_82544 &&
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1739
	    hw->bus_type == e1000_bus_type_pcix)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1740
		adapter->pcix_82544 = 1;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1741
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1742
	E1000_WRITE_REG(hw, TCTL, tctl);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1743
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1744
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1745
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1746
/**
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1747
 * e1000_setup_rx_resources - allocate Rx resources (Descriptors)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1748
 * @adapter: board private structure
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1749
 * @rxdr:    rx descriptor ring (for a specific queue) to setup
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1750
 *
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1751
 * Returns 0 on success, negative on failure
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1752
 **/
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1753
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1754
static int
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1755
e1000_setup_rx_resources(struct e1000_adapter *adapter,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1756
                         struct e1000_rx_ring *rxdr)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1757
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1758
	struct pci_dev *pdev = adapter->pdev;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1759
	int size, desc_len;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1760
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1761
	size = sizeof(struct e1000_buffer) * rxdr->count;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1762
	rxdr->buffer_info = vmalloc(size);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1763
	if (!rxdr->buffer_info) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1764
		DPRINTK(PROBE, ERR,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1765
		"Unable to allocate memory for the receive descriptor ring\n");
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1766
		return -ENOMEM;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1767
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1768
	memset(rxdr->buffer_info, 0, size);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1769
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1770
	rxdr->ps_page = kcalloc(rxdr->count, sizeof(struct e1000_ps_page),
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1771
	                        GFP_KERNEL);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1772
	if (!rxdr->ps_page) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1773
		vfree(rxdr->buffer_info);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1774
		DPRINTK(PROBE, ERR,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1775
		"Unable to allocate memory for the receive descriptor ring\n");
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1776
		return -ENOMEM;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1777
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1778
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1779
	rxdr->ps_page_dma = kcalloc(rxdr->count,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1780
	                            sizeof(struct e1000_ps_page_dma),
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1781
	                            GFP_KERNEL);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1782
	if (!rxdr->ps_page_dma) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1783
		vfree(rxdr->buffer_info);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1784
		kfree(rxdr->ps_page);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1785
		DPRINTK(PROBE, ERR,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1786
		"Unable to allocate memory for the receive descriptor ring\n");
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1787
		return -ENOMEM;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1788
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1789
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1790
	if (adapter->hw.mac_type <= e1000_82547_rev_2)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1791
		desc_len = sizeof(struct e1000_rx_desc);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1792
	else
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1793
		desc_len = sizeof(union e1000_rx_desc_packet_split);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1794
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1795
	/* Round up to nearest 4K */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1796
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1797
	rxdr->size = rxdr->count * desc_len;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1798
	rxdr->size = ALIGN(rxdr->size, 4096);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1799
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1800
	rxdr->desc = pci_alloc_consistent(pdev, rxdr->size, &rxdr->dma);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1801
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1802
	if (!rxdr->desc) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1803
		DPRINTK(PROBE, ERR,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1804
		"Unable to allocate memory for the receive descriptor ring\n");
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1805
setup_rx_desc_die:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1806
		vfree(rxdr->buffer_info);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1807
		kfree(rxdr->ps_page);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1808
		kfree(rxdr->ps_page_dma);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1809
		return -ENOMEM;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1810
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1811
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1812
	/* Fix for errata 23, can't cross 64kB boundary */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1813
	if (!e1000_check_64k_bound(adapter, rxdr->desc, rxdr->size)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1814
		void *olddesc = rxdr->desc;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1815
		dma_addr_t olddma = rxdr->dma;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1816
		DPRINTK(RX_ERR, ERR, "rxdr align check failed: %u bytes "
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1817
				     "at %p\n", rxdr->size, rxdr->desc);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1818
		/* Try again, without freeing the previous */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1819
		rxdr->desc = pci_alloc_consistent(pdev, rxdr->size, &rxdr->dma);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1820
		/* Failed allocation, critical failure */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1821
		if (!rxdr->desc) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1822
			pci_free_consistent(pdev, rxdr->size, olddesc, olddma);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1823
			DPRINTK(PROBE, ERR,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1824
				"Unable to allocate memory "
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1825
				"for the receive descriptor ring\n");
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1826
			goto setup_rx_desc_die;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1827
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1828
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1829
		if (!e1000_check_64k_bound(adapter, rxdr->desc, rxdr->size)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1830
			/* give up */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1831
			pci_free_consistent(pdev, rxdr->size, rxdr->desc,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1832
					    rxdr->dma);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1833
			pci_free_consistent(pdev, rxdr->size, olddesc, olddma);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1834
			DPRINTK(PROBE, ERR,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1835
				"Unable to allocate aligned memory "
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1836
				"for the receive descriptor ring\n");
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1837
			goto setup_rx_desc_die;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1838
		} else {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1839
			/* Free old allocation, new allocation was successful */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1840
			pci_free_consistent(pdev, rxdr->size, olddesc, olddma);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1841
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1842
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1843
	memset(rxdr->desc, 0, rxdr->size);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1844
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1845
	rxdr->next_to_clean = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1846
	rxdr->next_to_use = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1847
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1848
	return 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1849
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1850
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1851
/**
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1852
 * e1000_setup_all_rx_resources - wrapper to allocate Rx resources
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1853
 * 				  (Descriptors) for all queues
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1854
 * @adapter: board private structure
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1855
 *
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1856
 * Return 0 on success, negative on failure
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1857
 **/
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1858
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1859
int
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1860
e1000_setup_all_rx_resources(struct e1000_adapter *adapter)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1861
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1862
	int i, err = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1863
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1864
	for (i = 0; i < adapter->num_rx_queues; i++) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1865
		err = e1000_setup_rx_resources(adapter, &adapter->rx_ring[i]);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1866
		if (err) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1867
			DPRINTK(PROBE, ERR,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1868
				"Allocation for Rx Queue %u failed\n", i);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1869
			for (i-- ; i >= 0; i--)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1870
				e1000_free_rx_resources(adapter,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1871
							&adapter->rx_ring[i]);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1872
			break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1873
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1874
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1875
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1876
	return err;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1877
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1878
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1879
/**
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1880
 * e1000_setup_rctl - configure the receive control registers
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1881
 * @adapter: Board private structure
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1882
 **/
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1883
#define PAGE_USE_COUNT(S) (((S) >> PAGE_SHIFT) + \
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1884
			(((S) & (PAGE_SIZE - 1)) ? 1 : 0))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1885
static void
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1886
e1000_setup_rctl(struct e1000_adapter *adapter)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1887
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1888
	uint32_t rctl, rfctl;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1889
	uint32_t psrctl = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1890
#ifndef CONFIG_E1000_DISABLE_PACKET_SPLIT
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1891
	uint32_t pages = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1892
#endif
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1893
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1894
	rctl = E1000_READ_REG(&adapter->hw, RCTL);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1895
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1896
	rctl &= ~(3 << E1000_RCTL_MO_SHIFT);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1897
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1898
	rctl |= E1000_RCTL_EN | E1000_RCTL_BAM |
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1899
		E1000_RCTL_LBM_NO | E1000_RCTL_RDMTS_HALF |
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1900
		(adapter->hw.mc_filter_type << E1000_RCTL_MO_SHIFT);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1901
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1902
	if (adapter->hw.tbi_compatibility_on == 1)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1903
		rctl |= E1000_RCTL_SBP;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1904
	else
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1905
		rctl &= ~E1000_RCTL_SBP;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1906
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1907
	if (adapter->netdev->mtu <= ETH_DATA_LEN)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1908
		rctl &= ~E1000_RCTL_LPE;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1909
	else
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1910
		rctl |= E1000_RCTL_LPE;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1911
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1912
	/* Setup buffer sizes */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1913
	rctl &= ~E1000_RCTL_SZ_4096;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1914
	rctl |= E1000_RCTL_BSEX;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1915
	switch (adapter->rx_buffer_len) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1916
		case E1000_RXBUFFER_256:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1917
			rctl |= E1000_RCTL_SZ_256;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1918
			rctl &= ~E1000_RCTL_BSEX;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1919
			break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1920
		case E1000_RXBUFFER_512:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1921
			rctl |= E1000_RCTL_SZ_512;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1922
			rctl &= ~E1000_RCTL_BSEX;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1923
			break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1924
		case E1000_RXBUFFER_1024:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1925
			rctl |= E1000_RCTL_SZ_1024;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1926
			rctl &= ~E1000_RCTL_BSEX;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1927
			break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1928
		case E1000_RXBUFFER_2048:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1929
		default:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1930
			rctl |= E1000_RCTL_SZ_2048;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1931
			rctl &= ~E1000_RCTL_BSEX;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1932
			break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1933
		case E1000_RXBUFFER_4096:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1934
			rctl |= E1000_RCTL_SZ_4096;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1935
			break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1936
		case E1000_RXBUFFER_8192:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1937
			rctl |= E1000_RCTL_SZ_8192;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1938
			break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1939
		case E1000_RXBUFFER_16384:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1940
			rctl |= E1000_RCTL_SZ_16384;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1941
			break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1942
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1943
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1944
#ifndef CONFIG_E1000_DISABLE_PACKET_SPLIT
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1945
	/* 82571 and greater support packet-split where the protocol
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1946
	 * header is placed in skb->data and the packet data is
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1947
	 * placed in pages hanging off of skb_shinfo(skb)->nr_frags.
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1948
	 * In the case of a non-split, skb->data is linearly filled,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1949
	 * followed by the page buffers.  Therefore, skb->data is
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1950
	 * sized to hold the largest protocol header.
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1951
	 */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1952
	/* allocations using alloc_page take too long for regular MTU
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1953
	 * so only enable packet split for jumbo frames */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1954
	pages = PAGE_USE_COUNT(adapter->netdev->mtu);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1955
	if ((adapter->hw.mac_type >= e1000_82571) && (pages <= 3) &&
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1956
	    PAGE_SIZE <= 16384 && (rctl & E1000_RCTL_LPE))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1957
		adapter->rx_ps_pages = pages;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1958
	else
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1959
		adapter->rx_ps_pages = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1960
#endif
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1961
	if (adapter->rx_ps_pages) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1962
		/* Configure extra packet-split registers */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1963
		rfctl = E1000_READ_REG(&adapter->hw, RFCTL);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1964
		rfctl |= E1000_RFCTL_EXTEN;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1965
		/* disable packet split support for IPv6 extension headers,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1966
		 * because some malformed IPv6 headers can hang the RX */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1967
		rfctl |= (E1000_RFCTL_IPV6_EX_DIS |
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1968
		          E1000_RFCTL_NEW_IPV6_EXT_DIS);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1969
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1970
		E1000_WRITE_REG(&adapter->hw, RFCTL, rfctl);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1971
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1972
		rctl |= E1000_RCTL_DTYP_PS;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1973
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1974
		psrctl |= adapter->rx_ps_bsize0 >>
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1975
			E1000_PSRCTL_BSIZE0_SHIFT;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1976
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1977
		switch (adapter->rx_ps_pages) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1978
		case 3:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1979
			psrctl |= PAGE_SIZE <<
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1980
				E1000_PSRCTL_BSIZE3_SHIFT;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1981
		case 2:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1982
			psrctl |= PAGE_SIZE <<
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1983
				E1000_PSRCTL_BSIZE2_SHIFT;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1984
		case 1:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1985
			psrctl |= PAGE_SIZE >>
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1986
				E1000_PSRCTL_BSIZE1_SHIFT;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1987
			break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1988
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1989
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1990
		E1000_WRITE_REG(&adapter->hw, PSRCTL, psrctl);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1991
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1992
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1993
	E1000_WRITE_REG(&adapter->hw, RCTL, rctl);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1994
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1995
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1996
/**
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1997
 * e1000_configure_rx - Configure 8254x Receive Unit after Reset
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1998
 * @adapter: board private structure
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1999
 *
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2000
 * Configure the Rx unit of the MAC after a reset.
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2001
 **/
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2002
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2003
static void
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2004
e1000_configure_rx(struct e1000_adapter *adapter)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2005
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2006
	uint64_t rdba;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2007
	struct e1000_hw *hw = &adapter->hw;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2008
	uint32_t rdlen, rctl, rxcsum, ctrl_ext;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2009
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2010
	if (adapter->rx_ps_pages) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2011
		/* this is a 32 byte descriptor */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2012
		rdlen = adapter->rx_ring[0].count *
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2013
			sizeof(union e1000_rx_desc_packet_split);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2014
		adapter->clean_rx = e1000_clean_rx_irq_ps;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2015
		adapter->alloc_rx_buf = e1000_alloc_rx_buffers_ps;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2016
	} else {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2017
		rdlen = adapter->rx_ring[0].count *
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2018
			sizeof(struct e1000_rx_desc);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2019
		adapter->clean_rx = e1000_clean_rx_irq;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2020
		adapter->alloc_rx_buf = e1000_alloc_rx_buffers;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2021
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2022
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2023
	/* disable receives while setting up the descriptors */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2024
	rctl = E1000_READ_REG(hw, RCTL);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2025
	E1000_WRITE_REG(hw, RCTL, rctl & ~E1000_RCTL_EN);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2026
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2027
	/* set the Receive Delay Timer Register */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2028
	E1000_WRITE_REG(hw, RDTR, adapter->rx_int_delay);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2029
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2030
	if (hw->mac_type >= e1000_82540) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2031
		E1000_WRITE_REG(hw, RADV, adapter->rx_abs_int_delay);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2032
		if (adapter->itr_setting != 0)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2033
			E1000_WRITE_REG(hw, ITR,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2034
				1000000000 / (adapter->itr * 256));
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2035
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2036
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2037
	if (hw->mac_type >= e1000_82571) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2038
		ctrl_ext = E1000_READ_REG(hw, CTRL_EXT);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2039
		/* Reset delay timers after every interrupt */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2040
		ctrl_ext |= E1000_CTRL_EXT_INT_TIMER_CLR;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2041
#ifdef CONFIG_E1000_NAPI
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2042
		/* Auto-Mask interrupts upon ICR access */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2043
		ctrl_ext |= E1000_CTRL_EXT_IAME;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2044
		E1000_WRITE_REG(hw, IAM, 0xffffffff);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2045
#endif
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2046
		E1000_WRITE_REG(hw, CTRL_EXT, ctrl_ext);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2047
		E1000_WRITE_FLUSH(hw);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2048
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2049
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2050
	/* Setup the HW Rx Head and Tail Descriptor Pointers and
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2051
	 * the Base and Length of the Rx Descriptor Ring */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2052
	switch (adapter->num_rx_queues) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2053
	case 1:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2054
	default:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2055
		rdba = adapter->rx_ring[0].dma;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2056
		E1000_WRITE_REG(hw, RDLEN, rdlen);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2057
		E1000_WRITE_REG(hw, RDBAH, (rdba >> 32));
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2058
		E1000_WRITE_REG(hw, RDBAL, (rdba & 0x00000000ffffffffULL));
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2059
		E1000_WRITE_REG(hw, RDT, 0);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2060
		E1000_WRITE_REG(hw, RDH, 0);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2061
		adapter->rx_ring[0].rdh = ((hw->mac_type >= e1000_82543) ? E1000_RDH : E1000_82542_RDH);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2062
		adapter->rx_ring[0].rdt = ((hw->mac_type >= e1000_82543) ? E1000_RDT : E1000_82542_RDT);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2063
		break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2064
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2065
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2066
	/* Enable 82543 Receive Checksum Offload for TCP and UDP */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2067
	if (hw->mac_type >= e1000_82543) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2068
		rxcsum = E1000_READ_REG(hw, RXCSUM);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2069
		if (adapter->rx_csum == TRUE) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2070
			rxcsum |= E1000_RXCSUM_TUOFL;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2071
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2072
			/* Enable 82571 IPv4 payload checksum for UDP fragments
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2073
			 * Must be used in conjunction with packet-split. */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2074
			if ((hw->mac_type >= e1000_82571) &&
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2075
			    (adapter->rx_ps_pages)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2076
				rxcsum |= E1000_RXCSUM_IPPCSE;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2077
			}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2078
		} else {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2079
			rxcsum &= ~E1000_RXCSUM_TUOFL;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2080
			/* don't need to clear IPPCSE as it defaults to 0 */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2081
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2082
		E1000_WRITE_REG(hw, RXCSUM, rxcsum);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2083
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2084
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2085
	/* enable early receives on 82573, only takes effect if using > 2048
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2086
	 * byte total frame size.  for example only for jumbo frames */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2087
#define E1000_ERT_2048 0x100
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2088
	if (hw->mac_type == e1000_82573)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2089
		E1000_WRITE_REG(hw, ERT, E1000_ERT_2048);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2090
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2091
	/* Enable Receives */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2092
	E1000_WRITE_REG(hw, RCTL, rctl);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2093
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2094
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2095
/**
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2096
 * e1000_free_tx_resources - Free Tx Resources per Queue
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2097
 * @adapter: board private structure
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2098
 * @tx_ring: Tx descriptor ring for a specific queue
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2099
 *
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2100
 * Free all transmit software resources
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2101
 **/
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2102
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2103
static void
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2104
e1000_free_tx_resources(struct e1000_adapter *adapter,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2105
                        struct e1000_tx_ring *tx_ring)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2106
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2107
	struct pci_dev *pdev = adapter->pdev;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2108
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2109
	e1000_clean_tx_ring(adapter, tx_ring);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2110
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2111
	vfree(tx_ring->buffer_info);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2112
	tx_ring->buffer_info = NULL;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2113
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2114
	pci_free_consistent(pdev, tx_ring->size, tx_ring->desc, tx_ring->dma);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2115
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2116
	tx_ring->desc = NULL;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2117
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2118
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2119
/**
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2120
 * e1000_free_all_tx_resources - Free Tx Resources for All Queues
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2121
 * @adapter: board private structure
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2122
 *
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2123
 * Free all transmit software resources
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2124
 **/
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2125
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2126
void
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2127
e1000_free_all_tx_resources(struct e1000_adapter *adapter)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2128
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2129
	int i;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2130
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2131
	for (i = 0; i < adapter->num_tx_queues; i++)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2132
		e1000_free_tx_resources(adapter, &adapter->tx_ring[i]);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2133
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2134
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2135
static void
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2136
e1000_unmap_and_free_tx_resource(struct e1000_adapter *adapter,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2137
			struct e1000_buffer *buffer_info)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2138
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2139
	if (buffer_info->dma) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2140
		pci_unmap_page(adapter->pdev,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2141
				buffer_info->dma,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2142
				buffer_info->length,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2143
				PCI_DMA_TODEVICE);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2144
		buffer_info->dma = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2145
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2146
	if (buffer_info->skb) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2147
		dev_kfree_skb_any(buffer_info->skb);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2148
		buffer_info->skb = NULL;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2149
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2150
	/* buffer_info must be completely set up in the transmit path */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2151
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2152
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2153
/**
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2154
 * e1000_clean_tx_ring - Free Tx Buffers
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2155
 * @adapter: board private structure
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2156
 * @tx_ring: ring to be cleaned
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2157
 **/
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2158
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2159
static void
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2160
e1000_clean_tx_ring(struct e1000_adapter *adapter,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2161
                    struct e1000_tx_ring *tx_ring)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2162
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2163
	struct e1000_buffer *buffer_info;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2164
	unsigned long size;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2165
	unsigned int i;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2166
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2167
	/* Free all the Tx ring sk_buffs */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2168
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2169
	for (i = 0; i < tx_ring->count; i++) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2170
		buffer_info = &tx_ring->buffer_info[i];
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2171
		e1000_unmap_and_free_tx_resource(adapter, buffer_info);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2172
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2173
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2174
	size = sizeof(struct e1000_buffer) * tx_ring->count;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2175
	memset(tx_ring->buffer_info, 0, size);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2176
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2177
	/* Zero out the descriptor ring */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2178
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2179
	memset(tx_ring->desc, 0, tx_ring->size);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2180
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2181
	tx_ring->next_to_use = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2182
	tx_ring->next_to_clean = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2183
	tx_ring->last_tx_tso = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2184
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2185
	writel(0, adapter->hw.hw_addr + tx_ring->tdh);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2186
	writel(0, adapter->hw.hw_addr + tx_ring->tdt);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2187
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2188
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2189
/**
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2190
 * e1000_clean_all_tx_rings - Free Tx Buffers for all queues
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2191
 * @adapter: board private structure
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2192
 **/
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2193
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2194
static void
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2195
e1000_clean_all_tx_rings(struct e1000_adapter *adapter)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2196
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2197
	int i;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2198
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2199
	for (i = 0; i < adapter->num_tx_queues; i++)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2200
		e1000_clean_tx_ring(adapter, &adapter->tx_ring[i]);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2201
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2202
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2203
/**
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2204
 * e1000_free_rx_resources - Free Rx Resources
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2205
 * @adapter: board private structure
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2206
 * @rx_ring: ring to clean the resources from
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2207
 *
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2208
 * Free all receive software resources
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2209
 **/
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2210
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2211
static void
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2212
e1000_free_rx_resources(struct e1000_adapter *adapter,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2213
                        struct e1000_rx_ring *rx_ring)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2214
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2215
	struct pci_dev *pdev = adapter->pdev;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2216
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2217
	e1000_clean_rx_ring(adapter, rx_ring);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2218
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2219
	vfree(rx_ring->buffer_info);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2220
	rx_ring->buffer_info = NULL;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2221
	kfree(rx_ring->ps_page);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2222
	rx_ring->ps_page = NULL;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2223
	kfree(rx_ring->ps_page_dma);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2224
	rx_ring->ps_page_dma = NULL;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2225
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2226
	pci_free_consistent(pdev, rx_ring->size, rx_ring->desc, rx_ring->dma);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2227
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2228
	rx_ring->desc = NULL;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2229
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2230
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2231
/**
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2232
 * e1000_free_all_rx_resources - Free Rx Resources for All Queues
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2233
 * @adapter: board private structure
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2234
 *
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2235
 * Free all receive software resources
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2236
 **/
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2237
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2238
void
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2239
e1000_free_all_rx_resources(struct e1000_adapter *adapter)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2240
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2241
	int i;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2242
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2243
	for (i = 0; i < adapter->num_rx_queues; i++)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2244
		e1000_free_rx_resources(adapter, &adapter->rx_ring[i]);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2245
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2246
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2247
/**
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2248
 * e1000_clean_rx_ring - Free Rx Buffers per Queue
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2249
 * @adapter: board private structure
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2250
 * @rx_ring: ring to free buffers from
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2251
 **/
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2252
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2253
static void
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2254
e1000_clean_rx_ring(struct e1000_adapter *adapter,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2255
                    struct e1000_rx_ring *rx_ring)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2256
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2257
	struct e1000_buffer *buffer_info;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2258
	struct e1000_ps_page *ps_page;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2259
	struct e1000_ps_page_dma *ps_page_dma;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2260
	struct pci_dev *pdev = adapter->pdev;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2261
	unsigned long size;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2262
	unsigned int i, j;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2263
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2264
	/* Free all the Rx ring sk_buffs */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2265
	for (i = 0; i < rx_ring->count; i++) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2266
		buffer_info = &rx_ring->buffer_info[i];
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2267
		if (buffer_info->skb) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2268
			pci_unmap_single(pdev,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2269
					 buffer_info->dma,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2270
					 buffer_info->length,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2271
					 PCI_DMA_FROMDEVICE);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2272
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2273
			dev_kfree_skb(buffer_info->skb);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2274
			buffer_info->skb = NULL;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2275
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2276
		ps_page = &rx_ring->ps_page[i];
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2277
		ps_page_dma = &rx_ring->ps_page_dma[i];
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2278
		for (j = 0; j < adapter->rx_ps_pages; j++) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2279
			if (!ps_page->ps_page[j]) break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2280
			pci_unmap_page(pdev,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2281
				       ps_page_dma->ps_page_dma[j],
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2282
				       PAGE_SIZE, PCI_DMA_FROMDEVICE);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2283
			ps_page_dma->ps_page_dma[j] = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2284
			put_page(ps_page->ps_page[j]);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2285
			ps_page->ps_page[j] = NULL;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2286
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2287
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2288
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2289
	size = sizeof(struct e1000_buffer) * rx_ring->count;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2290
	memset(rx_ring->buffer_info, 0, size);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2291
	size = sizeof(struct e1000_ps_page) * rx_ring->count;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2292
	memset(rx_ring->ps_page, 0, size);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2293
	size = sizeof(struct e1000_ps_page_dma) * rx_ring->count;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2294
	memset(rx_ring->ps_page_dma, 0, size);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2295
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2296
	/* Zero out the descriptor ring */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2297
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2298
	memset(rx_ring->desc, 0, rx_ring->size);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2299
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2300
	rx_ring->next_to_clean = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2301
	rx_ring->next_to_use = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2302
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2303
	writel(0, adapter->hw.hw_addr + rx_ring->rdh);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2304
	writel(0, adapter->hw.hw_addr + rx_ring->rdt);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2305
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2306
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2307
/**
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2308
 * e1000_clean_all_rx_rings - Free Rx Buffers for all queues
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2309
 * @adapter: board private structure
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2310
 **/
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2311
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2312
static void
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2313
e1000_clean_all_rx_rings(struct e1000_adapter *adapter)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2314
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2315
	int i;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2316
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2317
	for (i = 0; i < adapter->num_rx_queues; i++)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2318
		e1000_clean_rx_ring(adapter, &adapter->rx_ring[i]);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2319
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2320
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2321
/* The 82542 2.0 (revision 2) needs to have the receive unit in reset
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2322
 * and memory write and invalidate disabled for certain operations
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2323
 */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2324
static void
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2325
e1000_enter_82542_rst(struct e1000_adapter *adapter)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2326
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2327
	struct net_device *netdev = adapter->netdev;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2328
	uint32_t rctl;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2329
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2330
	e1000_pci_clear_mwi(&adapter->hw);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2331
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2332
	rctl = E1000_READ_REG(&adapter->hw, RCTL);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2333
	rctl |= E1000_RCTL_RST;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2334
	E1000_WRITE_REG(&adapter->hw, RCTL, rctl);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2335
	E1000_WRITE_FLUSH(&adapter->hw);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2336
	mdelay(5);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2337
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2338
	if (netif_running(netdev))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2339
		e1000_clean_all_rx_rings(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2340
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2341
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2342
static void
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2343
e1000_leave_82542_rst(struct e1000_adapter *adapter)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2344
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2345
	struct net_device *netdev = adapter->netdev;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2346
	uint32_t rctl;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2347
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2348
	rctl = E1000_READ_REG(&adapter->hw, RCTL);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2349
	rctl &= ~E1000_RCTL_RST;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2350
	E1000_WRITE_REG(&adapter->hw, RCTL, rctl);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2351
	E1000_WRITE_FLUSH(&adapter->hw);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2352
	mdelay(5);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2353
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2354
	if (adapter->hw.pci_cmd_word & PCI_COMMAND_INVALIDATE)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2355
		e1000_pci_set_mwi(&adapter->hw);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2356
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2357
	if (netif_running(netdev)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2358
		/* No need to loop, because 82542 supports only 1 queue */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2359
		struct e1000_rx_ring *ring = &adapter->rx_ring[0];
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2360
		e1000_configure_rx(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2361
		adapter->alloc_rx_buf(adapter, ring, E1000_DESC_UNUSED(ring));
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2362
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2363
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2364
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2365
/**
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2366
 * e1000_set_mac - Change the Ethernet Address of the NIC
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2367
 * @netdev: network interface device structure
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2368
 * @p: pointer to an address structure
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2369
 *
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2370
 * Returns 0 on success, negative on failure
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2371
 **/
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2372
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2373
static int
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2374
e1000_set_mac(struct net_device *netdev, void *p)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2375
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2376
	struct e1000_adapter *adapter = netdev_priv(netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2377
	struct sockaddr *addr = p;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2378
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2379
	if (!is_valid_ether_addr(addr->sa_data))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2380
		return -EADDRNOTAVAIL;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2381
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2382
	/* 82542 2.0 needs to be in reset to write receive address registers */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2383
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2384
	if (adapter->hw.mac_type == e1000_82542_rev2_0)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2385
		e1000_enter_82542_rst(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2386
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2387
	memcpy(netdev->dev_addr, addr->sa_data, netdev->addr_len);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2388
	memcpy(adapter->hw.mac_addr, addr->sa_data, netdev->addr_len);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2389
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2390
	e1000_rar_set(&adapter->hw, adapter->hw.mac_addr, 0);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2391
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2392
	/* With 82571 controllers, LAA may be overwritten (with the default)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2393
	 * due to controller reset from the other port. */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2394
	if (adapter->hw.mac_type == e1000_82571) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2395
		/* activate the work around */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2396
		adapter->hw.laa_is_present = 1;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2397
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2398
		/* Hold a copy of the LAA in RAR[14] This is done so that
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2399
		 * between the time RAR[0] gets clobbered  and the time it
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2400
		 * gets fixed (in e1000_watchdog), the actual LAA is in one
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2401
		 * of the RARs and no incoming packets directed to this port
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2402
		 * are dropped. Eventaully the LAA will be in RAR[0] and
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2403
		 * RAR[14] */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2404
		e1000_rar_set(&adapter->hw, adapter->hw.mac_addr,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2405
					E1000_RAR_ENTRIES - 1);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2406
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2407
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2408
	if (adapter->hw.mac_type == e1000_82542_rev2_0)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2409
		e1000_leave_82542_rst(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2410
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2411
	return 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2412
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2413
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2414
/**
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2415
 * e1000_set_multi - Multicast and Promiscuous mode set
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2416
 * @netdev: network interface device structure
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2417
 *
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2418
 * The set_multi entry point is called whenever the multicast address
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2419
 * list or the network interface flags are updated.  This routine is
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2420
 * responsible for configuring the hardware for proper multicast,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2421
 * promiscuous mode, and all-multi behavior.
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2422
 **/
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2423
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2424
static void
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2425
e1000_set_multi(struct net_device *netdev)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2426
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2427
	struct e1000_adapter *adapter = netdev_priv(netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2428
	struct e1000_hw *hw = &adapter->hw;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2429
	struct dev_mc_list *mc_ptr;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2430
	uint32_t rctl;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2431
	uint32_t hash_value;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2432
	int i, rar_entries = E1000_RAR_ENTRIES;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2433
	int mta_reg_count = (hw->mac_type == e1000_ich8lan) ?
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2434
				E1000_NUM_MTA_REGISTERS_ICH8LAN :
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2435
				E1000_NUM_MTA_REGISTERS;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2436
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2437
	if (adapter->hw.mac_type == e1000_ich8lan)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2438
		rar_entries = E1000_RAR_ENTRIES_ICH8LAN;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2439
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2440
	/* reserve RAR[14] for LAA over-write work-around */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2441
	if (adapter->hw.mac_type == e1000_82571)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2442
		rar_entries--;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2443
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2444
	/* Check for Promiscuous and All Multicast modes */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2445
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2446
	rctl = E1000_READ_REG(hw, RCTL);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2447
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2448
	if (netdev->flags & IFF_PROMISC) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2449
		rctl |= (E1000_RCTL_UPE | E1000_RCTL_MPE);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2450
	} else if (netdev->flags & IFF_ALLMULTI) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2451
		rctl |= E1000_RCTL_MPE;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2452
		rctl &= ~E1000_RCTL_UPE;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2453
	} else {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2454
		rctl &= ~(E1000_RCTL_UPE | E1000_RCTL_MPE);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2455
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2456
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2457
	E1000_WRITE_REG(hw, RCTL, rctl);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2458
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2459
	/* 82542 2.0 needs to be in reset to write receive address registers */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2460
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2461
	if (hw->mac_type == e1000_82542_rev2_0)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2462
		e1000_enter_82542_rst(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2463
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2464
	/* load the first 14 multicast address into the exact filters 1-14
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2465
	 * RAR 0 is used for the station MAC adddress
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2466
	 * if there are not 14 addresses, go ahead and clear the filters
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2467
	 * -- with 82571 controllers only 0-13 entries are filled here
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2468
	 */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2469
	mc_ptr = netdev->mc_list;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2470
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2471
	for (i = 1; i < rar_entries; i++) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2472
		if (mc_ptr) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2473
			e1000_rar_set(hw, mc_ptr->dmi_addr, i);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2474
			mc_ptr = mc_ptr->next;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2475
		} else {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2476
			E1000_WRITE_REG_ARRAY(hw, RA, i << 1, 0);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2477
			E1000_WRITE_FLUSH(hw);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2478
			E1000_WRITE_REG_ARRAY(hw, RA, (i << 1) + 1, 0);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2479
			E1000_WRITE_FLUSH(hw);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2480
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2481
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2482
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2483
	/* clear the old settings from the multicast hash table */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2484
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2485
	for (i = 0; i < mta_reg_count; i++) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2486
		E1000_WRITE_REG_ARRAY(hw, MTA, i, 0);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2487
		E1000_WRITE_FLUSH(hw);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2488
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2489
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2490
	/* load any remaining addresses into the hash table */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2491
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2492
	for (; mc_ptr; mc_ptr = mc_ptr->next) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2493
		hash_value = e1000_hash_mc_addr(hw, mc_ptr->dmi_addr);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2494
		e1000_mta_set(hw, hash_value);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2495
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2496
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2497
	if (hw->mac_type == e1000_82542_rev2_0)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2498
		e1000_leave_82542_rst(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2499
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2500
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2501
/* Need to wait a few seconds after link up to get diagnostic information from
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2502
 * the phy */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2503
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2504
static void
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2505
e1000_update_phy_info(unsigned long data)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2506
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2507
	struct e1000_adapter *adapter = (struct e1000_adapter *) data;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2508
	e1000_phy_get_info(&adapter->hw, &adapter->phy_info);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2509
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2510
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2511
/**
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2512
 * e1000_82547_tx_fifo_stall - Timer Call-back
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2513
 * @data: pointer to adapter cast into an unsigned long
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2514
 **/
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2515
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2516
static void
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2517
e1000_82547_tx_fifo_stall(unsigned long data)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2518
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2519
	struct e1000_adapter *adapter = (struct e1000_adapter *) data;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2520
	struct net_device *netdev = adapter->netdev;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2521
	uint32_t tctl;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2522
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2523
	if (atomic_read(&adapter->tx_fifo_stall)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2524
		if ((E1000_READ_REG(&adapter->hw, TDT) ==
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2525
		    E1000_READ_REG(&adapter->hw, TDH)) &&
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2526
		   (E1000_READ_REG(&adapter->hw, TDFT) ==
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2527
		    E1000_READ_REG(&adapter->hw, TDFH)) &&
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2528
		   (E1000_READ_REG(&adapter->hw, TDFTS) ==
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2529
		    E1000_READ_REG(&adapter->hw, TDFHS))) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2530
			tctl = E1000_READ_REG(&adapter->hw, TCTL);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2531
			E1000_WRITE_REG(&adapter->hw, TCTL,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2532
					tctl & ~E1000_TCTL_EN);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2533
			E1000_WRITE_REG(&adapter->hw, TDFT,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2534
					adapter->tx_head_addr);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2535
			E1000_WRITE_REG(&adapter->hw, TDFH,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2536
					adapter->tx_head_addr);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2537
			E1000_WRITE_REG(&adapter->hw, TDFTS,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2538
					adapter->tx_head_addr);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2539
			E1000_WRITE_REG(&adapter->hw, TDFHS,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2540
					adapter->tx_head_addr);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2541
			E1000_WRITE_REG(&adapter->hw, TCTL, tctl);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2542
			E1000_WRITE_FLUSH(&adapter->hw);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2543
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2544
			adapter->tx_fifo_head = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2545
			atomic_set(&adapter->tx_fifo_stall, 0);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2546
			netif_wake_queue(netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2547
		} else {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2548
			mod_timer(&adapter->tx_fifo_stall_timer, jiffies + 1);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2549
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2550
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2551
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2552
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2553
/**
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2554
 * e1000_watchdog - Timer Call-back
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2555
 * @data: pointer to adapter cast into an unsigned long
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2556
 **/
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2557
static void
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2558
e1000_watchdog(unsigned long data)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2559
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2560
	struct e1000_adapter *adapter = (struct e1000_adapter *) data;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2561
	struct net_device *netdev = adapter->netdev;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2562
	struct e1000_tx_ring *txdr = adapter->tx_ring;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2563
	uint32_t link, tctl;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2564
	int32_t ret_val;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2565
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2566
	ret_val = e1000_check_for_link(&adapter->hw);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2567
	if ((ret_val == E1000_ERR_PHY) &&
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2568
	    (adapter->hw.phy_type == e1000_phy_igp_3) &&
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2569
	    (E1000_READ_REG(&adapter->hw, CTRL) & E1000_PHY_CTRL_GBE_DISABLE)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2570
		/* See e1000_kumeran_lock_loss_workaround() */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2571
		DPRINTK(LINK, INFO,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2572
			"Gigabit has been disabled, downgrading speed\n");
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2573
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2574
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2575
	if (adapter->hw.mac_type == e1000_82573) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2576
		e1000_enable_tx_pkt_filtering(&adapter->hw);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2577
		if (adapter->mng_vlan_id != adapter->hw.mng_cookie.vlan_id)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2578
			e1000_update_mng_vlan(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2579
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2580
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2581
	if ((adapter->hw.media_type == e1000_media_type_internal_serdes) &&
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2582
	   !(E1000_READ_REG(&adapter->hw, TXCW) & E1000_TXCW_ANE))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2583
		link = !adapter->hw.serdes_link_down;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2584
	else
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2585
		link = E1000_READ_REG(&adapter->hw, STATUS) & E1000_STATUS_LU;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2586
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2587
	if (link) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2588
		if (!netif_carrier_ok(netdev)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2589
			uint32_t ctrl;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2590
			boolean_t txb2b = 1;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2591
			e1000_get_speed_and_duplex(&adapter->hw,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2592
			                           &adapter->link_speed,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2593
			                           &adapter->link_duplex);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2594
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2595
			ctrl = E1000_READ_REG(&adapter->hw, CTRL);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2596
			DPRINTK(LINK, INFO, "NIC Link is Up %d Mbps %s, "
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2597
			        "Flow Control: %s\n",
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2598
			        adapter->link_speed,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2599
			        adapter->link_duplex == FULL_DUPLEX ?
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2600
			        "Full Duplex" : "Half Duplex",
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2601
			        ((ctrl & E1000_CTRL_TFCE) && (ctrl &
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2602
			        E1000_CTRL_RFCE)) ? "RX/TX" : ((ctrl &
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2603
			        E1000_CTRL_RFCE) ? "RX" : ((ctrl &
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2604
			        E1000_CTRL_TFCE) ? "TX" : "None" )));
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2605
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2606
			/* tweak tx_queue_len according to speed/duplex
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2607
			 * and adjust the timeout factor */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2608
			netdev->tx_queue_len = adapter->tx_queue_len;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2609
			adapter->tx_timeout_factor = 1;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2610
			switch (adapter->link_speed) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2611
			case SPEED_10:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2612
				txb2b = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2613
				netdev->tx_queue_len = 10;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2614
				adapter->tx_timeout_factor = 8;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2615
				break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2616
			case SPEED_100:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2617
				txb2b = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2618
				netdev->tx_queue_len = 100;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2619
				/* maybe add some timeout factor ? */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2620
				break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2621
			}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2622
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2623
			if ((adapter->hw.mac_type == e1000_82571 ||
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2624
			     adapter->hw.mac_type == e1000_82572) &&
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2625
			    txb2b == 0) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2626
				uint32_t tarc0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2627
				tarc0 = E1000_READ_REG(&adapter->hw, TARC0);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2628
				tarc0 &= ~(1 << 21);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2629
				E1000_WRITE_REG(&adapter->hw, TARC0, tarc0);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2630
			}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2631
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2632
			/* disable TSO for pcie and 10/100 speeds, to avoid
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2633
			 * some hardware issues */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2634
			if (!adapter->tso_force &&
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2635
			    adapter->hw.bus_type == e1000_bus_type_pci_express){
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2636
				switch (adapter->link_speed) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2637
				case SPEED_10:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2638
				case SPEED_100:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2639
					DPRINTK(PROBE,INFO,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2640
				        "10/100 speed: disabling TSO\n");
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2641
					netdev->features &= ~NETIF_F_TSO;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2642
					netdev->features &= ~NETIF_F_TSO6;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2643
					break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2644
				case SPEED_1000:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2645
					netdev->features |= NETIF_F_TSO;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2646
					netdev->features |= NETIF_F_TSO6;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2647
					break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2648
				default:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2649
					/* oops */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2650
					break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2651
				}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2652
			}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2653
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2654
			/* enable transmits in the hardware, need to do this
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2655
			 * after setting TARC0 */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2656
			tctl = E1000_READ_REG(&adapter->hw, TCTL);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2657
			tctl |= E1000_TCTL_EN;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2658
			E1000_WRITE_REG(&adapter->hw, TCTL, tctl);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2659
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2660
			netif_carrier_on(netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2661
			netif_wake_queue(netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2662
			mod_timer(&adapter->phy_info_timer, round_jiffies(jiffies + 2 * HZ));
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2663
			adapter->smartspeed = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2664
		} else {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2665
			/* make sure the receive unit is started */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2666
			if (adapter->hw.rx_needs_kicking) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2667
				struct e1000_hw *hw = &adapter->hw;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2668
				uint32_t rctl = E1000_READ_REG(hw, RCTL);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2669
				E1000_WRITE_REG(hw, RCTL, rctl | E1000_RCTL_EN);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2670
			}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2671
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2672
	} else {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2673
		if (netif_carrier_ok(netdev)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2674
			adapter->link_speed = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2675
			adapter->link_duplex = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2676
			DPRINTK(LINK, INFO, "NIC Link is Down\n");
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2677
			netif_carrier_off(netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2678
			netif_stop_queue(netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2679
			mod_timer(&adapter->phy_info_timer, round_jiffies(jiffies + 2 * HZ));
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2680
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2681
			/* 80003ES2LAN workaround--
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2682
			 * For packet buffer work-around on link down event;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2683
			 * disable receives in the ISR and
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2684
			 * reset device here in the watchdog
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2685
			 */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2686
			if (adapter->hw.mac_type == e1000_80003es2lan)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2687
				/* reset device */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2688
				schedule_work(&adapter->reset_task);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2689
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2690
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2691
		e1000_smartspeed(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2692
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2693
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2694
	e1000_update_stats(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2695
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2696
	adapter->hw.tx_packet_delta = adapter->stats.tpt - adapter->tpt_old;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2697
	adapter->tpt_old = adapter->stats.tpt;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2698
	adapter->hw.collision_delta = adapter->stats.colc - adapter->colc_old;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2699
	adapter->colc_old = adapter->stats.colc;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2700
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2701
	adapter->gorcl = adapter->stats.gorcl - adapter->gorcl_old;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2702
	adapter->gorcl_old = adapter->stats.gorcl;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2703
	adapter->gotcl = adapter->stats.gotcl - adapter->gotcl_old;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2704
	adapter->gotcl_old = adapter->stats.gotcl;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2705
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2706
	e1000_update_adaptive(&adapter->hw);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2707
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2708
	if (!netif_carrier_ok(netdev)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2709
		if (E1000_DESC_UNUSED(txdr) + 1 < txdr->count) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2710
			/* We've lost link, so the controller stops DMA,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2711
			 * but we've got queued Tx work that's never going
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2712
			 * to get done, so reset controller to flush Tx.
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2713
			 * (Do the reset outside of interrupt context). */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2714
			adapter->tx_timeout_count++;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2715
			schedule_work(&adapter->reset_task);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2716
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2717
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2718
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2719
	/* Cause software interrupt to ensure rx ring is cleaned */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2720
	E1000_WRITE_REG(&adapter->hw, ICS, E1000_ICS_RXDMT0);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2721
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2722
	/* Force detection of hung controller every watchdog period */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2723
	adapter->detect_tx_hung = TRUE;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2724
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2725
	/* With 82571 controllers, LAA may be overwritten due to controller
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2726
	 * reset from the other port. Set the appropriate LAA in RAR[0] */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2727
	if (adapter->hw.mac_type == e1000_82571 && adapter->hw.laa_is_present)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2728
		e1000_rar_set(&adapter->hw, adapter->hw.mac_addr, 0);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2729
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2730
	/* Reset the timer */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2731
	mod_timer(&adapter->watchdog_timer, round_jiffies(jiffies + 2 * HZ));
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2732
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2733
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2734
enum latency_range {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2735
	lowest_latency = 0,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2736
	low_latency = 1,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2737
	bulk_latency = 2,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2738
	latency_invalid = 255
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2739
};
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2740
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2741
/**
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2742
 * e1000_update_itr - update the dynamic ITR value based on statistics
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2743
 *      Stores a new ITR value based on packets and byte
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2744
 *      counts during the last interrupt.  The advantage of per interrupt
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2745
 *      computation is faster updates and more accurate ITR for the current
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2746
 *      traffic pattern.  Constants in this function were computed
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2747
 *      based on theoretical maximum wire speed and thresholds were set based
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2748
 *      on testing data as well as attempting to minimize response time
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2749
 *      while increasing bulk throughput.
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2750
 *      this functionality is controlled by the InterruptThrottleRate module
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2751
 *      parameter (see e1000_param.c)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2752
 * @adapter: pointer to adapter
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2753
 * @itr_setting: current adapter->itr
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2754
 * @packets: the number of packets during this measurement interval
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2755
 * @bytes: the number of bytes during this measurement interval
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2756
 **/
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2757
static unsigned int e1000_update_itr(struct e1000_adapter *adapter,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2758
                                   uint16_t itr_setting,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2759
                                   int packets,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2760
                                   int bytes)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2761
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2762
	unsigned int retval = itr_setting;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2763
	struct e1000_hw *hw = &adapter->hw;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2764
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2765
	if (unlikely(hw->mac_type < e1000_82540))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2766
		goto update_itr_done;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2767
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2768
	if (packets == 0)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2769
		goto update_itr_done;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2770
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2771
	switch (itr_setting) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2772
	case lowest_latency:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2773
		/* jumbo frames get bulk treatment*/
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2774
		if (bytes/packets > 8000)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2775
			retval = bulk_latency;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2776
		else if ((packets < 5) && (bytes > 512))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2777
			retval = low_latency;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2778
		break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2779
	case low_latency:  /* 50 usec aka 20000 ints/s */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2780
		if (bytes > 10000) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2781
			/* jumbo frames need bulk latency setting */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2782
			if (bytes/packets > 8000)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2783
				retval = bulk_latency;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2784
			else if ((packets < 10) || ((bytes/packets) > 1200))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2785
				retval = bulk_latency;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2786
			else if ((packets > 35))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2787
				retval = lowest_latency;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2788
		} else if (bytes/packets > 2000)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2789
			retval = bulk_latency;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2790
		else if (packets <= 2 && bytes < 512)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2791
			retval = lowest_latency;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2792
		break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2793
	case bulk_latency: /* 250 usec aka 4000 ints/s */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2794
		if (bytes > 25000) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2795
			if (packets > 35)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2796
				retval = low_latency;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2797
		} else if (bytes < 6000) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2798
			retval = low_latency;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2799
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2800
		break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2801
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2802
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2803
update_itr_done:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2804
	return retval;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2805
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2806
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2807
static void e1000_set_itr(struct e1000_adapter *adapter)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2808
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2809
	struct e1000_hw *hw = &adapter->hw;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2810
	uint16_t current_itr;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2811
	uint32_t new_itr = adapter->itr;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2812
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2813
	if (unlikely(hw->mac_type < e1000_82540))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2814
		return;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2815
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2816
	/* for non-gigabit speeds, just fix the interrupt rate at 4000 */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2817
	if (unlikely(adapter->link_speed != SPEED_1000)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2818
		current_itr = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2819
		new_itr = 4000;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2820
		goto set_itr_now;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2821
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2822
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2823
	adapter->tx_itr = e1000_update_itr(adapter,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2824
	                            adapter->tx_itr,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2825
	                            adapter->total_tx_packets,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2826
	                            adapter->total_tx_bytes);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2827
	/* conservative mode (itr 3) eliminates the lowest_latency setting */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2828
	if (adapter->itr_setting == 3 && adapter->tx_itr == lowest_latency)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2829
		adapter->tx_itr = low_latency;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2830
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2831
	adapter->rx_itr = e1000_update_itr(adapter,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2832
	                            adapter->rx_itr,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2833
	                            adapter->total_rx_packets,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2834
	                            adapter->total_rx_bytes);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2835
	/* conservative mode (itr 3) eliminates the lowest_latency setting */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2836
	if (adapter->itr_setting == 3 && adapter->rx_itr == lowest_latency)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2837
		adapter->rx_itr = low_latency;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2838
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2839
	current_itr = max(adapter->rx_itr, adapter->tx_itr);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2840
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2841
	switch (current_itr) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2842
	/* counts and packets in update_itr are dependent on these numbers */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2843
	case lowest_latency:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2844
		new_itr = 70000;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2845
		break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2846
	case low_latency:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2847
		new_itr = 20000; /* aka hwitr = ~200 */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2848
		break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2849
	case bulk_latency:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2850
		new_itr = 4000;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2851
		break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2852
	default:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2853
		break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2854
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2855
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2856
set_itr_now:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2857
	if (new_itr != adapter->itr) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2858
		/* this attempts to bias the interrupt rate towards Bulk
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2859
		 * by adding intermediate steps when interrupt rate is
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2860
		 * increasing */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2861
		new_itr = new_itr > adapter->itr ?
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2862
		             min(adapter->itr + (new_itr >> 2), new_itr) :
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2863
		             new_itr;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2864
		adapter->itr = new_itr;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2865
		E1000_WRITE_REG(hw, ITR, 1000000000 / (new_itr * 256));
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2866
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2867
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2868
	return;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2869
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2870
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2871
#define E1000_TX_FLAGS_CSUM		0x00000001
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2872
#define E1000_TX_FLAGS_VLAN		0x00000002
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2873
#define E1000_TX_FLAGS_TSO		0x00000004
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2874
#define E1000_TX_FLAGS_IPV4		0x00000008
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2875
#define E1000_TX_FLAGS_VLAN_MASK	0xffff0000
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2876
#define E1000_TX_FLAGS_VLAN_SHIFT	16
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2877
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2878
static int
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2879
e1000_tso(struct e1000_adapter *adapter, struct e1000_tx_ring *tx_ring,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2880
          struct sk_buff *skb)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2881
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2882
	struct e1000_context_desc *context_desc;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2883
	struct e1000_buffer *buffer_info;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2884
	unsigned int i;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2885
	uint32_t cmd_length = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2886
	uint16_t ipcse = 0, tucse, mss;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2887
	uint8_t ipcss, ipcso, tucss, tucso, hdr_len;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2888
	int err;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2889
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2890
	if (skb_is_gso(skb)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2891
		if (skb_header_cloned(skb)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2892
			err = pskb_expand_head(skb, 0, 0, GFP_ATOMIC);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2893
			if (err)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2894
				return err;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2895
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2896
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2897
		hdr_len = skb_transport_offset(skb) + tcp_hdrlen(skb);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2898
		mss = skb_shinfo(skb)->gso_size;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2899
		if (skb->protocol == htons(ETH_P_IP)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2900
			struct iphdr *iph = ip_hdr(skb);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2901
			iph->tot_len = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2902
			iph->check = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2903
			tcp_hdr(skb)->check = ~csum_tcpudp_magic(iph->saddr,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2904
								 iph->daddr, 0,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2905
								 IPPROTO_TCP,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2906
								 0);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2907
			cmd_length = E1000_TXD_CMD_IP;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2908
			ipcse = skb_transport_offset(skb) - 1;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2909
		} else if (skb->protocol == htons(ETH_P_IPV6)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2910
			ipv6_hdr(skb)->payload_len = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2911
			tcp_hdr(skb)->check =
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2912
				~csum_ipv6_magic(&ipv6_hdr(skb)->saddr,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2913
						 &ipv6_hdr(skb)->daddr,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2914
						 0, IPPROTO_TCP, 0);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2915
			ipcse = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2916
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2917
		ipcss = skb_network_offset(skb);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2918
		ipcso = (void *)&(ip_hdr(skb)->check) - (void *)skb->data;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2919
		tucss = skb_transport_offset(skb);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2920
		tucso = (void *)&(tcp_hdr(skb)->check) - (void *)skb->data;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2921
		tucse = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2922
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2923
		cmd_length |= (E1000_TXD_CMD_DEXT | E1000_TXD_CMD_TSE |
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2924
			       E1000_TXD_CMD_TCP | (skb->len - (hdr_len)));
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2925
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2926
		i = tx_ring->next_to_use;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2927
		context_desc = E1000_CONTEXT_DESC(*tx_ring, i);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2928
		buffer_info = &tx_ring->buffer_info[i];
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2929
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2930
		context_desc->lower_setup.ip_fields.ipcss  = ipcss;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2931
		context_desc->lower_setup.ip_fields.ipcso  = ipcso;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2932
		context_desc->lower_setup.ip_fields.ipcse  = cpu_to_le16(ipcse);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2933
		context_desc->upper_setup.tcp_fields.tucss = tucss;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2934
		context_desc->upper_setup.tcp_fields.tucso = tucso;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2935
		context_desc->upper_setup.tcp_fields.tucse = cpu_to_le16(tucse);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2936
		context_desc->tcp_seg_setup.fields.mss     = cpu_to_le16(mss);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2937
		context_desc->tcp_seg_setup.fields.hdr_len = hdr_len;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2938
		context_desc->cmd_and_length = cpu_to_le32(cmd_length);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2939
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2940
		buffer_info->time_stamp = jiffies;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2941
		buffer_info->next_to_watch = i;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2942
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2943
		if (++i == tx_ring->count) i = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2944
		tx_ring->next_to_use = i;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2945
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2946
		return TRUE;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2947
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2948
	return FALSE;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2949
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2950
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2951
static boolean_t
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2952
e1000_tx_csum(struct e1000_adapter *adapter, struct e1000_tx_ring *tx_ring,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2953
              struct sk_buff *skb)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2954
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2955
	struct e1000_context_desc *context_desc;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2956
	struct e1000_buffer *buffer_info;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2957
	unsigned int i;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2958
	uint8_t css;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2959
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2960
	if (likely(skb->ip_summed == CHECKSUM_PARTIAL)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2961
		css = skb_transport_offset(skb);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2962
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2963
		i = tx_ring->next_to_use;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2964
		buffer_info = &tx_ring->buffer_info[i];
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2965
		context_desc = E1000_CONTEXT_DESC(*tx_ring, i);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2966
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2967
		context_desc->lower_setup.ip_config = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2968
		context_desc->upper_setup.tcp_fields.tucss = css;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2969
		context_desc->upper_setup.tcp_fields.tucso =
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2970
			css + skb->csum_offset;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2971
		context_desc->upper_setup.tcp_fields.tucse = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2972
		context_desc->tcp_seg_setup.data = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2973
		context_desc->cmd_and_length = cpu_to_le32(E1000_TXD_CMD_DEXT);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2974
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2975
		buffer_info->time_stamp = jiffies;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2976
		buffer_info->next_to_watch = i;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2977
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2978
		if (unlikely(++i == tx_ring->count)) i = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2979
		tx_ring->next_to_use = i;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2980
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2981
		return TRUE;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2982
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2983
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2984
	return FALSE;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2985
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2986
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2987
#define E1000_MAX_TXD_PWR	12
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2988
#define E1000_MAX_DATA_PER_TXD	(1<<E1000_MAX_TXD_PWR)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2989
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2990
static int
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2991
e1000_tx_map(struct e1000_adapter *adapter, struct e1000_tx_ring *tx_ring,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2992
             struct sk_buff *skb, unsigned int first, unsigned int max_per_txd,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2993
             unsigned int nr_frags, unsigned int mss)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2994
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2995
	struct e1000_buffer *buffer_info;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2996
	unsigned int len = skb->len;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2997
	unsigned int offset = 0, size, count = 0, i;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2998
	unsigned int f;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2999
	len -= skb->data_len;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3000
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3001
	i = tx_ring->next_to_use;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3002
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3003
	while (len) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3004
		buffer_info = &tx_ring->buffer_info[i];
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3005
		size = min(len, max_per_txd);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3006
		/* Workaround for Controller erratum --
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3007
		 * descriptor for non-tso packet in a linear SKB that follows a
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3008
		 * tso gets written back prematurely before the data is fully
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3009
		 * DMA'd to the controller */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3010
		if (!skb->data_len && tx_ring->last_tx_tso &&
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3011
		    !skb_is_gso(skb)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3012
			tx_ring->last_tx_tso = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3013
			size -= 4;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3014
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3015
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3016
		/* Workaround for premature desc write-backs
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3017
		 * in TSO mode.  Append 4-byte sentinel desc */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3018
		if (unlikely(mss && !nr_frags && size == len && size > 8))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3019
			size -= 4;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3020
		/* work-around for errata 10 and it applies
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3021
		 * to all controllers in PCI-X mode
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3022
		 * The fix is to make sure that the first descriptor of a
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3023
		 * packet is smaller than 2048 - 16 - 16 (or 2016) bytes
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3024
		 */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3025
		if (unlikely((adapter->hw.bus_type == e1000_bus_type_pcix) &&
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3026
		                (size > 2015) && count == 0))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3027
		        size = 2015;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3028
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3029
		/* Workaround for potential 82544 hang in PCI-X.  Avoid
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3030
		 * terminating buffers within evenly-aligned dwords. */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3031
		if (unlikely(adapter->pcix_82544 &&
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3032
		   !((unsigned long)(skb->data + offset + size - 1) & 4) &&
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3033
		   size > 4))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3034
			size -= 4;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3035
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3036
		buffer_info->length = size;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3037
		buffer_info->dma =
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3038
			pci_map_single(adapter->pdev,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3039
				skb->data + offset,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3040
				size,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3041
				PCI_DMA_TODEVICE);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3042
		buffer_info->time_stamp = jiffies;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3043
		buffer_info->next_to_watch = i;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3044
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3045
		len -= size;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3046
		offset += size;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3047
		count++;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3048
		if (unlikely(++i == tx_ring->count)) i = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3049
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3050
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3051
	for (f = 0; f < nr_frags; f++) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3052
		struct skb_frag_struct *frag;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3053
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3054
		frag = &skb_shinfo(skb)->frags[f];
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3055
		len = frag->size;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3056
		offset = frag->page_offset;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3057
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3058
		while (len) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3059
			buffer_info = &tx_ring->buffer_info[i];
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3060
			size = min(len, max_per_txd);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3061
			/* Workaround for premature desc write-backs
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3062
			 * in TSO mode.  Append 4-byte sentinel desc */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3063
			if (unlikely(mss && f == (nr_frags-1) && size == len && size > 8))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3064
				size -= 4;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3065
			/* Workaround for potential 82544 hang in PCI-X.
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3066
			 * Avoid terminating buffers within evenly-aligned
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3067
			 * dwords. */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3068
			if (unlikely(adapter->pcix_82544 &&
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3069
			   !((unsigned long)(frag->page+offset+size-1) & 4) &&
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3070
			   size > 4))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3071
				size -= 4;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3072
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3073
			buffer_info->length = size;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3074
			buffer_info->dma =
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3075
				pci_map_page(adapter->pdev,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3076
					frag->page,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3077
					offset,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3078
					size,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3079
					PCI_DMA_TODEVICE);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3080
			buffer_info->time_stamp = jiffies;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3081
			buffer_info->next_to_watch = i;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3082
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3083
			len -= size;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3084
			offset += size;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3085
			count++;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3086
			if (unlikely(++i == tx_ring->count)) i = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3087
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3088
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3089
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3090
	i = (i == 0) ? tx_ring->count - 1 : i - 1;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3091
	tx_ring->buffer_info[i].skb = skb;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3092
	tx_ring->buffer_info[first].next_to_watch = i;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3093
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3094
	return count;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3095
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3096
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3097
static void
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3098
e1000_tx_queue(struct e1000_adapter *adapter, struct e1000_tx_ring *tx_ring,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3099
               int tx_flags, int count)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3100
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3101
	struct e1000_tx_desc *tx_desc = NULL;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3102
	struct e1000_buffer *buffer_info;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3103
	uint32_t txd_upper = 0, txd_lower = E1000_TXD_CMD_IFCS;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3104
	unsigned int i;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3105
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3106
	if (likely(tx_flags & E1000_TX_FLAGS_TSO)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3107
		txd_lower |= E1000_TXD_CMD_DEXT | E1000_TXD_DTYP_D |
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3108
		             E1000_TXD_CMD_TSE;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3109
		txd_upper |= E1000_TXD_POPTS_TXSM << 8;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3110
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3111
		if (likely(tx_flags & E1000_TX_FLAGS_IPV4))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3112
			txd_upper |= E1000_TXD_POPTS_IXSM << 8;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3113
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3114
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3115
	if (likely(tx_flags & E1000_TX_FLAGS_CSUM)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3116
		txd_lower |= E1000_TXD_CMD_DEXT | E1000_TXD_DTYP_D;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3117
		txd_upper |= E1000_TXD_POPTS_TXSM << 8;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3118
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3119
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3120
	if (unlikely(tx_flags & E1000_TX_FLAGS_VLAN)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3121
		txd_lower |= E1000_TXD_CMD_VLE;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3122
		txd_upper |= (tx_flags & E1000_TX_FLAGS_VLAN_MASK);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3123
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3124
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3125
	i = tx_ring->next_to_use;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3126
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3127
	while (count--) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3128
		buffer_info = &tx_ring->buffer_info[i];
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3129
		tx_desc = E1000_TX_DESC(*tx_ring, i);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3130
		tx_desc->buffer_addr = cpu_to_le64(buffer_info->dma);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3131
		tx_desc->lower.data =
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3132
			cpu_to_le32(txd_lower | buffer_info->length);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3133
		tx_desc->upper.data = cpu_to_le32(txd_upper);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3134
		if (unlikely(++i == tx_ring->count)) i = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3135
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3136
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3137
	tx_desc->lower.data |= cpu_to_le32(adapter->txd_cmd);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3138
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3139
	/* Force memory writes to complete before letting h/w
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3140
	 * know there are new descriptors to fetch.  (Only
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3141
	 * applicable for weak-ordered memory model archs,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3142
	 * such as IA-64). */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3143
	wmb();
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3144
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3145
	tx_ring->next_to_use = i;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3146
	writel(i, adapter->hw.hw_addr + tx_ring->tdt);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3147
	/* we need this if more than one processor can write to our tail
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3148
	 * at a time, it syncronizes IO on IA64/Altix systems */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3149
	mmiowb();
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3150
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3151
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3152
/**
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3153
 * 82547 workaround to avoid controller hang in half-duplex environment.
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3154
 * The workaround is to avoid queuing a large packet that would span
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3155
 * the internal Tx FIFO ring boundary by notifying the stack to resend
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3156
 * the packet at a later time.  This gives the Tx FIFO an opportunity to
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3157
 * flush all packets.  When that occurs, we reset the Tx FIFO pointers
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3158
 * to the beginning of the Tx FIFO.
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3159
 **/
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3160
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3161
#define E1000_FIFO_HDR			0x10
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3162
#define E1000_82547_PAD_LEN		0x3E0
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3163
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3164
static int
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3165
e1000_82547_fifo_workaround(struct e1000_adapter *adapter, struct sk_buff *skb)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3166
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3167
	uint32_t fifo_space = adapter->tx_fifo_size - adapter->tx_fifo_head;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3168
	uint32_t skb_fifo_len = skb->len + E1000_FIFO_HDR;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3169
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3170
	skb_fifo_len = ALIGN(skb_fifo_len, E1000_FIFO_HDR);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3171
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3172
	if (adapter->link_duplex != HALF_DUPLEX)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3173
		goto no_fifo_stall_required;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3174
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3175
	if (atomic_read(&adapter->tx_fifo_stall))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3176
		return 1;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3177
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3178
	if (skb_fifo_len >= (E1000_82547_PAD_LEN + fifo_space)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3179
		atomic_set(&adapter->tx_fifo_stall, 1);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3180
		return 1;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3181
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3182
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3183
no_fifo_stall_required:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3184
	adapter->tx_fifo_head += skb_fifo_len;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3185
	if (adapter->tx_fifo_head >= adapter->tx_fifo_size)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3186
		adapter->tx_fifo_head -= adapter->tx_fifo_size;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3187
	return 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3188
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3189
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3190
#define MINIMUM_DHCP_PACKET_SIZE 282
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3191
static int
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3192
e1000_transfer_dhcp_info(struct e1000_adapter *adapter, struct sk_buff *skb)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3193
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3194
	struct e1000_hw *hw =  &adapter->hw;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3195
	uint16_t length, offset;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3196
	if (vlan_tx_tag_present(skb)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3197
		if (!((vlan_tx_tag_get(skb) == adapter->hw.mng_cookie.vlan_id) &&
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3198
			( adapter->hw.mng_cookie.status &
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3199
			  E1000_MNG_DHCP_COOKIE_STATUS_VLAN_SUPPORT)) )
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3200
			return 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3201
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3202
	if (skb->len > MINIMUM_DHCP_PACKET_SIZE) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3203
		struct ethhdr *eth = (struct ethhdr *) skb->data;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3204
		if ((htons(ETH_P_IP) == eth->h_proto)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3205
			const struct iphdr *ip =
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3206
				(struct iphdr *)((uint8_t *)skb->data+14);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3207
			if (IPPROTO_UDP == ip->protocol) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3208
				struct udphdr *udp =
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3209
					(struct udphdr *)((uint8_t *)ip +
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3210
						(ip->ihl << 2));
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3211
				if (ntohs(udp->dest) == 67) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3212
					offset = (uint8_t *)udp + 8 - skb->data;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3213
					length = skb->len - offset;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3214
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3215
					return e1000_mng_write_dhcp_info(hw,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3216
							(uint8_t *)udp + 8,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3217
							length);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3218
				}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3219
			}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3220
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3221
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3222
	return 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3223
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3224
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3225
static int __e1000_maybe_stop_tx(struct net_device *netdev, int size)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3226
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3227
	struct e1000_adapter *adapter = netdev_priv(netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3228
	struct e1000_tx_ring *tx_ring = adapter->tx_ring;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3229
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3230
	netif_stop_queue(netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3231
	/* Herbert's original patch had:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3232
	 *  smp_mb__after_netif_stop_queue();
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3233
	 * but since that doesn't exist yet, just open code it. */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3234
	smp_mb();
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3235
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3236
	/* We need to check again in a case another CPU has just
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3237
	 * made room available. */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3238
	if (likely(E1000_DESC_UNUSED(tx_ring) < size))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3239
		return -EBUSY;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3240
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3241
	/* A reprieve! */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3242
	netif_start_queue(netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3243
	++adapter->restart_queue;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3244
	return 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3245
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3246
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3247
static int e1000_maybe_stop_tx(struct net_device *netdev,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3248
                               struct e1000_tx_ring *tx_ring, int size)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3249
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3250
	if (likely(E1000_DESC_UNUSED(tx_ring) >= size))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3251
		return 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3252
	return __e1000_maybe_stop_tx(netdev, size);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3253
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3254
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3255
#define TXD_USE_COUNT(S, X) (((S) >> (X)) + 1 )
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3256
static int
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3257
e1000_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3258
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3259
	struct e1000_adapter *adapter = netdev_priv(netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3260
	struct e1000_tx_ring *tx_ring;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3261
	unsigned int first, max_per_txd = E1000_MAX_DATA_PER_TXD;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3262
	unsigned int max_txd_pwr = E1000_MAX_TXD_PWR;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3263
	unsigned int tx_flags = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3264
	unsigned int len = skb->len;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3265
	unsigned long flags;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3266
	unsigned int nr_frags = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3267
	unsigned int mss = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3268
	int count = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3269
	int tso;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3270
	unsigned int f;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3271
	len -= skb->data_len;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3272
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3273
	/* This goes back to the question of how to logically map a tx queue
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3274
	 * to a flow.  Right now, performance is impacted slightly negatively
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3275
	 * if using multiple tx queues.  If the stack breaks away from a
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3276
	 * single qdisc implementation, we can look at this again. */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3277
	tx_ring = adapter->tx_ring;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3278
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3279
	if (unlikely(skb->len <= 0)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3280
		dev_kfree_skb_any(skb);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3281
		return NETDEV_TX_OK;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3282
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3283
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3284
	/* 82571 and newer doesn't need the workaround that limited descriptor
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3285
	 * length to 4kB */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3286
	if (adapter->hw.mac_type >= e1000_82571)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3287
		max_per_txd = 8192;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3288
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3289
	mss = skb_shinfo(skb)->gso_size;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3290
	/* The controller does a simple calculation to
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3291
	 * make sure there is enough room in the FIFO before
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3292
	 * initiating the DMA for each buffer.  The calc is:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3293
	 * 4 = ceil(buffer len/mss).  To make sure we don't
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3294
	 * overrun the FIFO, adjust the max buffer len if mss
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3295
	 * drops. */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3296
	if (mss) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3297
		uint8_t hdr_len;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3298
		max_per_txd = min(mss << 2, max_per_txd);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3299
		max_txd_pwr = fls(max_per_txd) - 1;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3300
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3301
		/* TSO Workaround for 82571/2/3 Controllers -- if skb->data
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3302
		* points to just header, pull a few bytes of payload from
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3303
		* frags into skb->data */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3304
		hdr_len = skb_transport_offset(skb) + tcp_hdrlen(skb);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3305
		if (skb->data_len && (hdr_len == (skb->len - skb->data_len))) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3306
			switch (adapter->hw.mac_type) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3307
				unsigned int pull_size;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3308
			case e1000_82544:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3309
				/* Make sure we have room to chop off 4 bytes,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3310
				 * and that the end alignment will work out to
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3311
				 * this hardware's requirements
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3312
				 * NOTE: this is a TSO only workaround
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3313
				 * if end byte alignment not correct move us
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3314
				 * into the next dword */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3315
				if ((unsigned long)(skb_tail_pointer(skb) - 1) & 4)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3316
					break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3317
				/* fall through */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3318
			case e1000_82571:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3319
			case e1000_82572:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3320
			case e1000_82573:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3321
			case e1000_ich8lan:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3322
				pull_size = min((unsigned int)4, skb->data_len);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3323
				if (!__pskb_pull_tail(skb, pull_size)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3324
					DPRINTK(DRV, ERR,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3325
						"__pskb_pull_tail failed.\n");
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3326
					dev_kfree_skb_any(skb);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3327
					return NETDEV_TX_OK;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3328
				}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3329
				len = skb->len - skb->data_len;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3330
				break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3331
			default:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3332
				/* do nothing */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3333
				break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3334
			}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3335
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3336
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3337
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3338
	/* reserve a descriptor for the offload context */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3339
	if ((mss) || (skb->ip_summed == CHECKSUM_PARTIAL))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3340
		count++;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3341
	count++;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3342
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3343
	/* Controller Erratum workaround */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3344
	if (!skb->data_len && tx_ring->last_tx_tso && !skb_is_gso(skb))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3345
		count++;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3346
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3347
	count += TXD_USE_COUNT(len, max_txd_pwr);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3348
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3349
	if (adapter->pcix_82544)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3350
		count++;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3351
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3352
	/* work-around for errata 10 and it applies to all controllers
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3353
	 * in PCI-X mode, so add one more descriptor to the count
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3354
	 */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3355
	if (unlikely((adapter->hw.bus_type == e1000_bus_type_pcix) &&
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3356
			(len > 2015)))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3357
		count++;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3358
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3359
	nr_frags = skb_shinfo(skb)->nr_frags;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3360
	for (f = 0; f < nr_frags; f++)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3361
		count += TXD_USE_COUNT(skb_shinfo(skb)->frags[f].size,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3362
				       max_txd_pwr);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3363
	if (adapter->pcix_82544)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3364
		count += nr_frags;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3365
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3366
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3367
	if (adapter->hw.tx_pkt_filtering &&
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3368
	    (adapter->hw.mac_type == e1000_82573))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3369
		e1000_transfer_dhcp_info(adapter, skb);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3370
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3371
	if (!spin_trylock_irqsave(&tx_ring->tx_lock, flags))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3372
		/* Collision - tell upper layer to requeue */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3373
		return NETDEV_TX_LOCKED;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3374
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3375
	/* need: count + 2 desc gap to keep tail from touching
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3376
	 * head, otherwise try next time */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3377
	if (unlikely(e1000_maybe_stop_tx(netdev, tx_ring, count + 2))) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3378
		spin_unlock_irqrestore(&tx_ring->tx_lock, flags);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3379
		return NETDEV_TX_BUSY;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3380
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3381
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3382
	if (unlikely(adapter->hw.mac_type == e1000_82547)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3383
		if (unlikely(e1000_82547_fifo_workaround(adapter, skb))) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3384
			netif_stop_queue(netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3385
			mod_timer(&adapter->tx_fifo_stall_timer, jiffies + 1);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3386
			spin_unlock_irqrestore(&tx_ring->tx_lock, flags);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3387
			return NETDEV_TX_BUSY;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3388
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3389
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3390
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3391
	if (unlikely(adapter->vlgrp && vlan_tx_tag_present(skb))) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3392
		tx_flags |= E1000_TX_FLAGS_VLAN;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3393
		tx_flags |= (vlan_tx_tag_get(skb) << E1000_TX_FLAGS_VLAN_SHIFT);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3394
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3395
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3396
	first = tx_ring->next_to_use;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3397
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3398
	tso = e1000_tso(adapter, tx_ring, skb);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3399
	if (tso < 0) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3400
		dev_kfree_skb_any(skb);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3401
		spin_unlock_irqrestore(&tx_ring->tx_lock, flags);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3402
		return NETDEV_TX_OK;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3403
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3404
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3405
	if (likely(tso)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3406
		tx_ring->last_tx_tso = 1;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3407
		tx_flags |= E1000_TX_FLAGS_TSO;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3408
	} else if (likely(e1000_tx_csum(adapter, tx_ring, skb)))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3409
		tx_flags |= E1000_TX_FLAGS_CSUM;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3410
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3411
	/* Old method was to assume IPv4 packet by default if TSO was enabled.
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3412
	 * 82571 hardware supports TSO capabilities for IPv6 as well...
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3413
	 * no longer assume, we must. */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3414
	if (likely(skb->protocol == htons(ETH_P_IP)))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3415
		tx_flags |= E1000_TX_FLAGS_IPV4;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3416
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3417
	e1000_tx_queue(adapter, tx_ring, tx_flags,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3418
	               e1000_tx_map(adapter, tx_ring, skb, first,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3419
	                            max_per_txd, nr_frags, mss));
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3420
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3421
	netdev->trans_start = jiffies;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3422
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3423
	/* Make sure there is space in the ring for the next send. */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3424
	e1000_maybe_stop_tx(netdev, tx_ring, MAX_SKB_FRAGS + 2);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3425
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3426
	spin_unlock_irqrestore(&tx_ring->tx_lock, flags);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3427
	return NETDEV_TX_OK;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3428
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3429
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3430
/**
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3431
 * e1000_tx_timeout - Respond to a Tx Hang
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3432
 * @netdev: network interface device structure
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3433
 **/
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3434
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3435
static void
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3436
e1000_tx_timeout(struct net_device *netdev)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3437
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3438
	struct e1000_adapter *adapter = netdev_priv(netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3439
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3440
	/* Do the reset outside of interrupt context */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3441
	adapter->tx_timeout_count++;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3442
	schedule_work(&adapter->reset_task);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3443
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3444
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3445
static void
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3446
e1000_reset_task(struct work_struct *work)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3447
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3448
	struct e1000_adapter *adapter =
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3449
		container_of(work, struct e1000_adapter, reset_task);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3450
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3451
	e1000_reinit_locked(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3452
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3453
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3454
/**
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3455
 * e1000_get_stats - Get System Network Statistics
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3456
 * @netdev: network interface device structure
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3457
 *
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3458
 * Returns the address of the device statistics structure.
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3459
 * The statistics are actually updated from the timer callback.
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3460
 **/
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3461
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3462
static struct net_device_stats *
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3463
e1000_get_stats(struct net_device *netdev)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3464
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3465
	struct e1000_adapter *adapter = netdev_priv(netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3466
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3467
	/* only return the current stats */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3468
	return &adapter->net_stats;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3469
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3470
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3471
/**
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3472
 * e1000_change_mtu - Change the Maximum Transfer Unit
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3473
 * @netdev: network interface device structure
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3474
 * @new_mtu: new value for maximum frame size
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3475
 *
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3476
 * Returns 0 on success, negative on failure
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3477
 **/
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3478
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3479
static int
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3480
e1000_change_mtu(struct net_device *netdev, int new_mtu)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3481
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3482
	struct e1000_adapter *adapter = netdev_priv(netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3483
	int max_frame = new_mtu + ENET_HEADER_SIZE + ETHERNET_FCS_SIZE;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3484
	uint16_t eeprom_data = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3485
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3486
	if ((max_frame < MINIMUM_ETHERNET_FRAME_SIZE) ||
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3487
	    (max_frame > MAX_JUMBO_FRAME_SIZE)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3488
		DPRINTK(PROBE, ERR, "Invalid MTU setting\n");
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3489
		return -EINVAL;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3490
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3491
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3492
	/* Adapter-specific max frame size limits. */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3493
	switch (adapter->hw.mac_type) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3494
	case e1000_undefined ... e1000_82542_rev2_1:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3495
	case e1000_ich8lan:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3496
		if (max_frame > MAXIMUM_ETHERNET_FRAME_SIZE) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3497
			DPRINTK(PROBE, ERR, "Jumbo Frames not supported.\n");
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3498
			return -EINVAL;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3499
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3500
		break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3501
	case e1000_82573:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3502
		/* Jumbo Frames not supported if:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3503
		 * - this is not an 82573L device
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3504
		 * - ASPM is enabled in any way (0x1A bits 3:2) */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3505
		e1000_read_eeprom(&adapter->hw, EEPROM_INIT_3GIO_3, 1,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3506
		                  &eeprom_data);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3507
		if ((adapter->hw.device_id != E1000_DEV_ID_82573L) ||
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3508
		    (eeprom_data & EEPROM_WORD1A_ASPM_MASK)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3509
			if (max_frame > MAXIMUM_ETHERNET_FRAME_SIZE) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3510
				DPRINTK(PROBE, ERR,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3511
			            	"Jumbo Frames not supported.\n");
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3512
				return -EINVAL;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3513
			}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3514
			break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3515
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3516
		/* ERT will be enabled later to enable wire speed receives */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3517
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3518
		/* fall through to get support */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3519
	case e1000_82571:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3520
	case e1000_82572:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3521
	case e1000_80003es2lan:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3522
#define MAX_STD_JUMBO_FRAME_SIZE 9234
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3523
		if (max_frame > MAX_STD_JUMBO_FRAME_SIZE) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3524
			DPRINTK(PROBE, ERR, "MTU > 9216 not supported.\n");
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3525
			return -EINVAL;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3526
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3527
		break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3528
	default:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3529
		/* Capable of supporting up to MAX_JUMBO_FRAME_SIZE limit. */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3530
		break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3531
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3532
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3533
	/* NOTE: netdev_alloc_skb reserves 16 bytes, and typically NET_IP_ALIGN
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3534
	 * means we reserve 2 more, this pushes us to allocate from the next
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3535
	 * larger slab size
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3536
	 * i.e. RXBUFFER_2048 --> size-4096 slab */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3537
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3538
	if (max_frame <= E1000_RXBUFFER_256)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3539
		adapter->rx_buffer_len = E1000_RXBUFFER_256;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3540
	else if (max_frame <= E1000_RXBUFFER_512)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3541
		adapter->rx_buffer_len = E1000_RXBUFFER_512;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3542
	else if (max_frame <= E1000_RXBUFFER_1024)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3543
		adapter->rx_buffer_len = E1000_RXBUFFER_1024;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3544
	else if (max_frame <= E1000_RXBUFFER_2048)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3545
		adapter->rx_buffer_len = E1000_RXBUFFER_2048;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3546
	else if (max_frame <= E1000_RXBUFFER_4096)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3547
		adapter->rx_buffer_len = E1000_RXBUFFER_4096;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3548
	else if (max_frame <= E1000_RXBUFFER_8192)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3549
		adapter->rx_buffer_len = E1000_RXBUFFER_8192;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3550
	else if (max_frame <= E1000_RXBUFFER_16384)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3551
		adapter->rx_buffer_len = E1000_RXBUFFER_16384;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3552
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3553
	/* adjust allocation if LPE protects us, and we aren't using SBP */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3554
	if (!adapter->hw.tbi_compatibility_on &&
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3555
	    ((max_frame == MAXIMUM_ETHERNET_FRAME_SIZE) ||
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3556
	     (max_frame == MAXIMUM_ETHERNET_VLAN_SIZE)))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3557
		adapter->rx_buffer_len = MAXIMUM_ETHERNET_VLAN_SIZE;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3558
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3559
	netdev->mtu = new_mtu;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3560
	adapter->hw.max_frame_size = max_frame;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3561
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3562
	if (netif_running(netdev))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3563
		e1000_reinit_locked(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3564
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3565
	return 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3566
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3567
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3568
/**
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3569
 * e1000_update_stats - Update the board statistics counters
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3570
 * @adapter: board private structure
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3571
 **/
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3572
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3573
void
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3574
e1000_update_stats(struct e1000_adapter *adapter)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3575
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3576
	struct e1000_hw *hw = &adapter->hw;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3577
	struct pci_dev *pdev = adapter->pdev;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3578
	unsigned long flags;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3579
	uint16_t phy_tmp;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3580
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3581
#define PHY_IDLE_ERROR_COUNT_MASK 0x00FF
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3582
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3583
	/*
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3584
	 * Prevent stats update while adapter is being reset, or if the pci
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3585
	 * connection is down.
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3586
	 */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3587
	if (adapter->link_speed == 0)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3588
		return;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3589
	if (pci_channel_offline(pdev))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3590
		return;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3591
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3592
	spin_lock_irqsave(&adapter->stats_lock, flags);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3593
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3594
	/* these counters are modified from e1000_adjust_tbi_stats,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3595
	 * called from the interrupt context, so they must only
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3596
	 * be written while holding adapter->stats_lock
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3597
	 */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3598
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3599
	adapter->stats.crcerrs += E1000_READ_REG(hw, CRCERRS);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3600
	adapter->stats.gprc += E1000_READ_REG(hw, GPRC);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3601
	adapter->stats.gorcl += E1000_READ_REG(hw, GORCL);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3602
	adapter->stats.gorch += E1000_READ_REG(hw, GORCH);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3603
	adapter->stats.bprc += E1000_READ_REG(hw, BPRC);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3604
	adapter->stats.mprc += E1000_READ_REG(hw, MPRC);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3605
	adapter->stats.roc += E1000_READ_REG(hw, ROC);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3606
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3607
	if (adapter->hw.mac_type != e1000_ich8lan) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3608
		adapter->stats.prc64 += E1000_READ_REG(hw, PRC64);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3609
		adapter->stats.prc127 += E1000_READ_REG(hw, PRC127);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3610
		adapter->stats.prc255 += E1000_READ_REG(hw, PRC255);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3611
		adapter->stats.prc511 += E1000_READ_REG(hw, PRC511);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3612
		adapter->stats.prc1023 += E1000_READ_REG(hw, PRC1023);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3613
		adapter->stats.prc1522 += E1000_READ_REG(hw, PRC1522);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3614
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3615
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3616
	adapter->stats.symerrs += E1000_READ_REG(hw, SYMERRS);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3617
	adapter->stats.mpc += E1000_READ_REG(hw, MPC);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3618
	adapter->stats.scc += E1000_READ_REG(hw, SCC);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3619
	adapter->stats.ecol += E1000_READ_REG(hw, ECOL);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3620
	adapter->stats.mcc += E1000_READ_REG(hw, MCC);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3621
	adapter->stats.latecol += E1000_READ_REG(hw, LATECOL);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3622
	adapter->stats.dc += E1000_READ_REG(hw, DC);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3623
	adapter->stats.sec += E1000_READ_REG(hw, SEC);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3624
	adapter->stats.rlec += E1000_READ_REG(hw, RLEC);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3625
	adapter->stats.xonrxc += E1000_READ_REG(hw, XONRXC);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3626
	adapter->stats.xontxc += E1000_READ_REG(hw, XONTXC);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3627
	adapter->stats.xoffrxc += E1000_READ_REG(hw, XOFFRXC);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3628
	adapter->stats.xofftxc += E1000_READ_REG(hw, XOFFTXC);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3629
	adapter->stats.fcruc += E1000_READ_REG(hw, FCRUC);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3630
	adapter->stats.gptc += E1000_READ_REG(hw, GPTC);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3631
	adapter->stats.gotcl += E1000_READ_REG(hw, GOTCL);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3632
	adapter->stats.gotch += E1000_READ_REG(hw, GOTCH);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3633
	adapter->stats.rnbc += E1000_READ_REG(hw, RNBC);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3634
	adapter->stats.ruc += E1000_READ_REG(hw, RUC);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3635
	adapter->stats.rfc += E1000_READ_REG(hw, RFC);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3636
	adapter->stats.rjc += E1000_READ_REG(hw, RJC);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3637
	adapter->stats.torl += E1000_READ_REG(hw, TORL);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3638
	adapter->stats.torh += E1000_READ_REG(hw, TORH);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3639
	adapter->stats.totl += E1000_READ_REG(hw, TOTL);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3640
	adapter->stats.toth += E1000_READ_REG(hw, TOTH);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3641
	adapter->stats.tpr += E1000_READ_REG(hw, TPR);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3642
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3643
	if (adapter->hw.mac_type != e1000_ich8lan) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3644
		adapter->stats.ptc64 += E1000_READ_REG(hw, PTC64);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3645
		adapter->stats.ptc127 += E1000_READ_REG(hw, PTC127);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3646
		adapter->stats.ptc255 += E1000_READ_REG(hw, PTC255);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3647
		adapter->stats.ptc511 += E1000_READ_REG(hw, PTC511);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3648
		adapter->stats.ptc1023 += E1000_READ_REG(hw, PTC1023);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3649
		adapter->stats.ptc1522 += E1000_READ_REG(hw, PTC1522);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3650
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3651
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3652
	adapter->stats.mptc += E1000_READ_REG(hw, MPTC);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3653
	adapter->stats.bptc += E1000_READ_REG(hw, BPTC);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3654
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3655
	/* used for adaptive IFS */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3656
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3657
	hw->tx_packet_delta = E1000_READ_REG(hw, TPT);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3658
	adapter->stats.tpt += hw->tx_packet_delta;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3659
	hw->collision_delta = E1000_READ_REG(hw, COLC);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3660
	adapter->stats.colc += hw->collision_delta;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3661
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3662
	if (hw->mac_type >= e1000_82543) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3663
		adapter->stats.algnerrc += E1000_READ_REG(hw, ALGNERRC);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3664
		adapter->stats.rxerrc += E1000_READ_REG(hw, RXERRC);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3665
		adapter->stats.tncrs += E1000_READ_REG(hw, TNCRS);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3666
		adapter->stats.cexterr += E1000_READ_REG(hw, CEXTERR);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3667
		adapter->stats.tsctc += E1000_READ_REG(hw, TSCTC);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3668
		adapter->stats.tsctfc += E1000_READ_REG(hw, TSCTFC);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3669
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3670
	if (hw->mac_type > e1000_82547_rev_2) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3671
		adapter->stats.iac += E1000_READ_REG(hw, IAC);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3672
		adapter->stats.icrxoc += E1000_READ_REG(hw, ICRXOC);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3673
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3674
		if (adapter->hw.mac_type != e1000_ich8lan) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3675
			adapter->stats.icrxptc += E1000_READ_REG(hw, ICRXPTC);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3676
			adapter->stats.icrxatc += E1000_READ_REG(hw, ICRXATC);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3677
			adapter->stats.ictxptc += E1000_READ_REG(hw, ICTXPTC);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3678
			adapter->stats.ictxatc += E1000_READ_REG(hw, ICTXATC);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3679
			adapter->stats.ictxqec += E1000_READ_REG(hw, ICTXQEC);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3680
			adapter->stats.ictxqmtc += E1000_READ_REG(hw, ICTXQMTC);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3681
			adapter->stats.icrxdmtc += E1000_READ_REG(hw, ICRXDMTC);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3682
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3683
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3684
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3685
	/* Fill out the OS statistics structure */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3686
	adapter->net_stats.rx_packets = adapter->stats.gprc;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3687
	adapter->net_stats.tx_packets = adapter->stats.gptc;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3688
	adapter->net_stats.rx_bytes = adapter->stats.gorcl;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3689
	adapter->net_stats.tx_bytes = adapter->stats.gotcl;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3690
	adapter->net_stats.multicast = adapter->stats.mprc;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3691
	adapter->net_stats.collisions = adapter->stats.colc;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3692
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3693
	/* Rx Errors */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3694
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3695
	/* RLEC on some newer hardware can be incorrect so build
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3696
	* our own version based on RUC and ROC */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3697
	adapter->net_stats.rx_errors = adapter->stats.rxerrc +
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3698
		adapter->stats.crcerrs + adapter->stats.algnerrc +
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3699
		adapter->stats.ruc + adapter->stats.roc +
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3700
		adapter->stats.cexterr;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3701
	adapter->stats.rlerrc = adapter->stats.ruc + adapter->stats.roc;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3702
	adapter->net_stats.rx_length_errors = adapter->stats.rlerrc;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3703
	adapter->net_stats.rx_crc_errors = adapter->stats.crcerrs;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3704
	adapter->net_stats.rx_frame_errors = adapter->stats.algnerrc;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3705
	adapter->net_stats.rx_missed_errors = adapter->stats.mpc;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3706
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3707
	/* Tx Errors */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3708
	adapter->stats.txerrc = adapter->stats.ecol + adapter->stats.latecol;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3709
	adapter->net_stats.tx_errors = adapter->stats.txerrc;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3710
	adapter->net_stats.tx_aborted_errors = adapter->stats.ecol;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3711
	adapter->net_stats.tx_window_errors = adapter->stats.latecol;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3712
	adapter->net_stats.tx_carrier_errors = adapter->stats.tncrs;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3713
	if (adapter->hw.bad_tx_carr_stats_fd &&
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3714
	    adapter->link_duplex == FULL_DUPLEX) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3715
		adapter->net_stats.tx_carrier_errors = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3716
		adapter->stats.tncrs = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3717
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3718
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3719
	/* Tx Dropped needs to be maintained elsewhere */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3720
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3721
	/* Phy Stats */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3722
	if (hw->media_type == e1000_media_type_copper) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3723
		if ((adapter->link_speed == SPEED_1000) &&
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3724
		   (!e1000_read_phy_reg(hw, PHY_1000T_STATUS, &phy_tmp))) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3725
			phy_tmp &= PHY_IDLE_ERROR_COUNT_MASK;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3726
			adapter->phy_stats.idle_errors += phy_tmp;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3727
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3728
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3729
		if ((hw->mac_type <= e1000_82546) &&
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3730
		   (hw->phy_type == e1000_phy_m88) &&
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3731
		   !e1000_read_phy_reg(hw, M88E1000_RX_ERR_CNTR, &phy_tmp))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3732
			adapter->phy_stats.receive_errors += phy_tmp;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3733
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3734
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3735
	/* Management Stats */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3736
	if (adapter->hw.has_smbus) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3737
		adapter->stats.mgptc += E1000_READ_REG(hw, MGTPTC);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3738
		adapter->stats.mgprc += E1000_READ_REG(hw, MGTPRC);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3739
		adapter->stats.mgpdc += E1000_READ_REG(hw, MGTPDC);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3740
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3741
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3742
	spin_unlock_irqrestore(&adapter->stats_lock, flags);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3743
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3744
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3745
/**
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3746
 * e1000_intr_msi - Interrupt Handler
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3747
 * @irq: interrupt number
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3748
 * @data: pointer to a network interface device structure
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3749
 **/
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3750
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3751
static irqreturn_t
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3752
e1000_intr_msi(int irq, void *data)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3753
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3754
	struct net_device *netdev = data;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3755
	struct e1000_adapter *adapter = netdev_priv(netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3756
	struct e1000_hw *hw = &adapter->hw;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3757
#ifndef CONFIG_E1000_NAPI
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3758
	int i;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3759
#endif
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3760
	uint32_t icr = E1000_READ_REG(hw, ICR);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3761
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3762
#ifdef CONFIG_E1000_NAPI
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3763
	/* read ICR disables interrupts using IAM, so keep up with our
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3764
	 * enable/disable accounting */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3765
	atomic_inc(&adapter->irq_sem);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3766
#endif
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3767
	if (icr & (E1000_ICR_RXSEQ | E1000_ICR_LSC)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3768
		hw->get_link_status = 1;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3769
		/* 80003ES2LAN workaround-- For packet buffer work-around on
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3770
		 * link down event; disable receives here in the ISR and reset
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3771
		 * adapter in watchdog */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3772
		if (netif_carrier_ok(netdev) &&
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3773
		    (adapter->hw.mac_type == e1000_80003es2lan)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3774
			/* disable receives */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3775
			uint32_t rctl = E1000_READ_REG(hw, RCTL);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3776
			E1000_WRITE_REG(hw, RCTL, rctl & ~E1000_RCTL_EN);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3777
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3778
		/* guard against interrupt when we're going down */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3779
		if (!test_bit(__E1000_DOWN, &adapter->flags))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3780
			mod_timer(&adapter->watchdog_timer, jiffies + 1);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3781
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3782
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3783
#ifdef CONFIG_E1000_NAPI
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3784
	if (likely(netif_rx_schedule_prep(netdev))) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3785
		adapter->total_tx_bytes = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3786
		adapter->total_tx_packets = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3787
		adapter->total_rx_bytes = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3788
		adapter->total_rx_packets = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3789
		__netif_rx_schedule(netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3790
	} else
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3791
		e1000_irq_enable(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3792
#else
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3793
	adapter->total_tx_bytes = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3794
	adapter->total_rx_bytes = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3795
	adapter->total_tx_packets = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3796
	adapter->total_rx_packets = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3797
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3798
	for (i = 0; i < E1000_MAX_INTR; i++)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3799
		if (unlikely(!adapter->clean_rx(adapter, adapter->rx_ring) &
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3800
		   !e1000_clean_tx_irq(adapter, adapter->tx_ring)))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3801
			break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3802
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3803
	if (likely(adapter->itr_setting & 3))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3804
		e1000_set_itr(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3805
#endif
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3806
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3807
	return IRQ_HANDLED;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3808
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3809
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3810
/**
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3811
 * e1000_intr - Interrupt Handler
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3812
 * @irq: interrupt number
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3813
 * @data: pointer to a network interface device structure
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3814
 **/
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3815
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3816
static irqreturn_t
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3817
e1000_intr(int irq, void *data)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3818
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3819
	struct net_device *netdev = data;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3820
	struct e1000_adapter *adapter = netdev_priv(netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3821
	struct e1000_hw *hw = &adapter->hw;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3822
	uint32_t rctl, icr = E1000_READ_REG(hw, ICR);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3823
#ifndef CONFIG_E1000_NAPI
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3824
	int i;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3825
#endif
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3826
	if (unlikely(!icr))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3827
		return IRQ_NONE;  /* Not our interrupt */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3828
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3829
#ifdef CONFIG_E1000_NAPI
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3830
	/* IMS will not auto-mask if INT_ASSERTED is not set, and if it is
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3831
	 * not set, then the adapter didn't send an interrupt */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3832
	if (unlikely(hw->mac_type >= e1000_82571 &&
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3833
	             !(icr & E1000_ICR_INT_ASSERTED)))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3834
		return IRQ_NONE;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3835
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3836
	/* Interrupt Auto-Mask...upon reading ICR,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3837
	 * interrupts are masked.  No need for the
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3838
	 * IMC write, but it does mean we should
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3839
	 * account for it ASAP. */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3840
	if (likely(hw->mac_type >= e1000_82571))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3841
		atomic_inc(&adapter->irq_sem);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3842
#endif
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3843
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3844
	if (unlikely(icr & (E1000_ICR_RXSEQ | E1000_ICR_LSC))) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3845
		hw->get_link_status = 1;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3846
		/* 80003ES2LAN workaround--
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3847
		 * For packet buffer work-around on link down event;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3848
		 * disable receives here in the ISR and
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3849
		 * reset adapter in watchdog
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3850
		 */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3851
		if (netif_carrier_ok(netdev) &&
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3852
		    (adapter->hw.mac_type == e1000_80003es2lan)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3853
			/* disable receives */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3854
			rctl = E1000_READ_REG(hw, RCTL);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3855
			E1000_WRITE_REG(hw, RCTL, rctl & ~E1000_RCTL_EN);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3856
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3857
		/* guard against interrupt when we're going down */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3858
		if (!test_bit(__E1000_DOWN, &adapter->flags))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3859
			mod_timer(&adapter->watchdog_timer, jiffies + 1);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3860
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3861
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3862
#ifdef CONFIG_E1000_NAPI
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3863
	if (unlikely(hw->mac_type < e1000_82571)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3864
		/* disable interrupts, without the synchronize_irq bit */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3865
		atomic_inc(&adapter->irq_sem);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3866
		E1000_WRITE_REG(hw, IMC, ~0);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3867
		E1000_WRITE_FLUSH(hw);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3868
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3869
	if (likely(netif_rx_schedule_prep(netdev))) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3870
		adapter->total_tx_bytes = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3871
		adapter->total_tx_packets = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3872
		adapter->total_rx_bytes = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3873
		adapter->total_rx_packets = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3874
		__netif_rx_schedule(netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3875
	} else
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3876
		/* this really should not happen! if it does it is basically a
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3877
		 * bug, but not a hard error, so enable ints and continue */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3878
		e1000_irq_enable(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3879
#else
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3880
	/* Writing IMC and IMS is needed for 82547.
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3881
	 * Due to Hub Link bus being occupied, an interrupt
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3882
	 * de-assertion message is not able to be sent.
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3883
	 * When an interrupt assertion message is generated later,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3884
	 * two messages are re-ordered and sent out.
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3885
	 * That causes APIC to think 82547 is in de-assertion
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3886
	 * state, while 82547 is in assertion state, resulting
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3887
	 * in dead lock. Writing IMC forces 82547 into
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3888
	 * de-assertion state.
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3889
	 */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3890
	if (hw->mac_type == e1000_82547 || hw->mac_type == e1000_82547_rev_2) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3891
		atomic_inc(&adapter->irq_sem);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3892
		E1000_WRITE_REG(hw, IMC, ~0);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3893
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3894
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3895
	adapter->total_tx_bytes = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3896
	adapter->total_rx_bytes = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3897
	adapter->total_tx_packets = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3898
	adapter->total_rx_packets = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3899
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3900
	for (i = 0; i < E1000_MAX_INTR; i++)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3901
		if (unlikely(!adapter->clean_rx(adapter, adapter->rx_ring) &
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3902
		   !e1000_clean_tx_irq(adapter, adapter->tx_ring)))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3903
			break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3904
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3905
	if (likely(adapter->itr_setting & 3))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3906
		e1000_set_itr(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3907
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3908
	if (hw->mac_type == e1000_82547 || hw->mac_type == e1000_82547_rev_2)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3909
		e1000_irq_enable(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3910
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3911
#endif
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3912
	return IRQ_HANDLED;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3913
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3914
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3915
#ifdef CONFIG_E1000_NAPI
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3916
/**
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3917
 * e1000_clean - NAPI Rx polling callback
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3918
 * @adapter: board private structure
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3919
 **/
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3920
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3921
static int
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3922
e1000_clean(struct net_device *poll_dev, int *budget)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3923
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3924
	struct e1000_adapter *adapter;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3925
	int work_to_do = min(*budget, poll_dev->quota);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3926
	int tx_cleaned = 0, work_done = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3927
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3928
	/* Must NOT use netdev_priv macro here. */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3929
	adapter = poll_dev->priv;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3930
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3931
	/* Keep link state information with original netdev */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3932
	if (!netif_carrier_ok(poll_dev))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3933
		goto quit_polling;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3934
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3935
	/* e1000_clean is called per-cpu.  This lock protects
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3936
	 * tx_ring[0] from being cleaned by multiple cpus
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3937
	 * simultaneously.  A failure obtaining the lock means
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3938
	 * tx_ring[0] is currently being cleaned anyway. */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3939
	if (spin_trylock(&adapter->tx_queue_lock)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3940
		tx_cleaned = e1000_clean_tx_irq(adapter,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3941
		                                &adapter->tx_ring[0]);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3942
		spin_unlock(&adapter->tx_queue_lock);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3943
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3944
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3945
	adapter->clean_rx(adapter, &adapter->rx_ring[0],
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3946
	                  &work_done, work_to_do);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3947
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3948
	*budget -= work_done;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3949
	poll_dev->quota -= work_done;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3950
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3951
	/* If no Tx and not enough Rx work done, exit the polling mode */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3952
	if ((!tx_cleaned && (work_done == 0)) ||
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3953
	   !netif_running(poll_dev)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3954
quit_polling:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3955
		if (likely(adapter->itr_setting & 3))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3956
			e1000_set_itr(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3957
		netif_rx_complete(poll_dev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3958
		e1000_irq_enable(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3959
		return 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3960
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3961
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3962
	return 1;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3963
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3964
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3965
#endif
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3966
/**
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3967
 * e1000_clean_tx_irq - Reclaim resources after transmit completes
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3968
 * @adapter: board private structure
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3969
 **/
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3970
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3971
static boolean_t
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3972
e1000_clean_tx_irq(struct e1000_adapter *adapter,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3973
                   struct e1000_tx_ring *tx_ring)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3974
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3975
	struct net_device *netdev = adapter->netdev;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3976
	struct e1000_tx_desc *tx_desc, *eop_desc;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3977
	struct e1000_buffer *buffer_info;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3978
	unsigned int i, eop;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3979
#ifdef CONFIG_E1000_NAPI
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3980
	unsigned int count = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3981
#endif
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3982
	boolean_t cleaned = FALSE;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3983
	unsigned int total_tx_bytes=0, total_tx_packets=0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3984
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3985
	i = tx_ring->next_to_clean;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3986
	eop = tx_ring->buffer_info[i].next_to_watch;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3987
	eop_desc = E1000_TX_DESC(*tx_ring, eop);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3988
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3989
	while (eop_desc->upper.data & cpu_to_le32(E1000_TXD_STAT_DD)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3990
		for (cleaned = FALSE; !cleaned; ) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3991
			tx_desc = E1000_TX_DESC(*tx_ring, i);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3992
			buffer_info = &tx_ring->buffer_info[i];
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3993
			cleaned = (i == eop);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3994
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3995
			if (cleaned) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3996
				struct sk_buff *skb = buffer_info->skb;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3997
				unsigned int segs, bytecount;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3998
				segs = skb_shinfo(skb)->gso_segs ?: 1;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3999
				/* multiply data chunks by size of headers */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4000
				bytecount = ((segs - 1) * skb_headlen(skb)) +
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4001
				            skb->len;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4002
				total_tx_packets += segs;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4003
				total_tx_bytes += bytecount;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4004
			}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4005
			e1000_unmap_and_free_tx_resource(adapter, buffer_info);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4006
			tx_desc->upper.data = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4007
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4008
			if (unlikely(++i == tx_ring->count)) i = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4009
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4010
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4011
		eop = tx_ring->buffer_info[i].next_to_watch;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4012
		eop_desc = E1000_TX_DESC(*tx_ring, eop);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4013
#ifdef CONFIG_E1000_NAPI
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4014
#define E1000_TX_WEIGHT 64
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4015
		/* weight of a sort for tx, to avoid endless transmit cleanup */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4016
		if (count++ == E1000_TX_WEIGHT) break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4017
#endif
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4018
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4019
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4020
	tx_ring->next_to_clean = i;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4021
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4022
#define TX_WAKE_THRESHOLD 32
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4023
	if (unlikely(cleaned && netif_carrier_ok(netdev) &&
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4024
		     E1000_DESC_UNUSED(tx_ring) >= TX_WAKE_THRESHOLD)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4025
		/* Make sure that anybody stopping the queue after this
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4026
		 * sees the new next_to_clean.
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4027
		 */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4028
		smp_mb();
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4029
		if (netif_queue_stopped(netdev)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4030
			netif_wake_queue(netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4031
			++adapter->restart_queue;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4032
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4033
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4034
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4035
	if (adapter->detect_tx_hung) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4036
		/* Detect a transmit hang in hardware, this serializes the
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4037
		 * check with the clearing of time_stamp and movement of i */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4038
		adapter->detect_tx_hung = FALSE;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4039
		if (tx_ring->buffer_info[eop].dma &&
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4040
		    time_after(jiffies, tx_ring->buffer_info[eop].time_stamp +
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4041
		               (adapter->tx_timeout_factor * HZ))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4042
		    && !(E1000_READ_REG(&adapter->hw, STATUS) &
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4043
		         E1000_STATUS_TXOFF)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4044
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4045
			/* detected Tx unit hang */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4046
			DPRINTK(DRV, ERR, "Detected Tx Unit Hang\n"
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4047
					"  Tx Queue             <%lu>\n"
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4048
					"  TDH                  <%x>\n"
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4049
					"  TDT                  <%x>\n"
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4050
					"  next_to_use          <%x>\n"
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4051
					"  next_to_clean        <%x>\n"
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4052
					"buffer_info[next_to_clean]\n"
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4053
					"  time_stamp           <%lx>\n"
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4054
					"  next_to_watch        <%x>\n"
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4055
					"  jiffies              <%lx>\n"
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4056
					"  next_to_watch.status <%x>\n",
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4057
				(unsigned long)((tx_ring - adapter->tx_ring) /
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4058
					sizeof(struct e1000_tx_ring)),
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4059
				readl(adapter->hw.hw_addr + tx_ring->tdh),
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4060
				readl(adapter->hw.hw_addr + tx_ring->tdt),
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4061
				tx_ring->next_to_use,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4062
				tx_ring->next_to_clean,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4063
				tx_ring->buffer_info[eop].time_stamp,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4064
				eop,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4065
				jiffies,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4066
				eop_desc->upper.fields.status);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4067
			netif_stop_queue(netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4068
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4069
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4070
	adapter->total_tx_bytes += total_tx_bytes;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4071
	adapter->total_tx_packets += total_tx_packets;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4072
	return cleaned;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4073
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4074
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4075
/**
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4076
 * e1000_rx_checksum - Receive Checksum Offload for 82543
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4077
 * @adapter:     board private structure
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4078
 * @status_err:  receive descriptor status and error fields
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4079
 * @csum:        receive descriptor csum field
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4080
 * @sk_buff:     socket buffer with received data
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4081
 **/
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4082
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4083
static void
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4084
e1000_rx_checksum(struct e1000_adapter *adapter,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4085
		  uint32_t status_err, uint32_t csum,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4086
		  struct sk_buff *skb)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4087
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4088
	uint16_t status = (uint16_t)status_err;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4089
	uint8_t errors = (uint8_t)(status_err >> 24);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4090
	skb->ip_summed = CHECKSUM_NONE;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4091
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4092
	/* 82543 or newer only */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4093
	if (unlikely(adapter->hw.mac_type < e1000_82543)) return;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4094
	/* Ignore Checksum bit is set */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4095
	if (unlikely(status & E1000_RXD_STAT_IXSM)) return;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4096
	/* TCP/UDP checksum error bit is set */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4097
	if (unlikely(errors & E1000_RXD_ERR_TCPE)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4098
		/* let the stack verify checksum errors */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4099
		adapter->hw_csum_err++;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4100
		return;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4101
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4102
	/* TCP/UDP Checksum has not been calculated */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4103
	if (adapter->hw.mac_type <= e1000_82547_rev_2) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4104
		if (!(status & E1000_RXD_STAT_TCPCS))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4105
			return;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4106
	} else {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4107
		if (!(status & (E1000_RXD_STAT_TCPCS | E1000_RXD_STAT_UDPCS)))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4108
			return;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4109
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4110
	/* It must be a TCP or UDP packet with a valid checksum */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4111
	if (likely(status & E1000_RXD_STAT_TCPCS)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4112
		/* TCP checksum is good */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4113
		skb->ip_summed = CHECKSUM_UNNECESSARY;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4114
	} else if (adapter->hw.mac_type > e1000_82547_rev_2) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4115
		/* IP fragment with UDP payload */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4116
		/* Hardware complements the payload checksum, so we undo it
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4117
		 * and then put the value in host order for further stack use.
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4118
		 */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4119
		csum = ntohl(csum ^ 0xFFFF);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4120
		skb->csum = csum;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4121
		skb->ip_summed = CHECKSUM_COMPLETE;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4122
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4123
	adapter->hw_csum_good++;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4124
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4125
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4126
/**
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4127
 * e1000_clean_rx_irq - Send received data up the network stack; legacy
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4128
 * @adapter: board private structure
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4129
 **/
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4130
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4131
static boolean_t
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4132
#ifdef CONFIG_E1000_NAPI
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4133
e1000_clean_rx_irq(struct e1000_adapter *adapter,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4134
                   struct e1000_rx_ring *rx_ring,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4135
                   int *work_done, int work_to_do)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4136
#else
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4137
e1000_clean_rx_irq(struct e1000_adapter *adapter,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4138
                   struct e1000_rx_ring *rx_ring)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4139
#endif
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4140
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4141
	struct net_device *netdev = adapter->netdev;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4142
	struct pci_dev *pdev = adapter->pdev;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4143
	struct e1000_rx_desc *rx_desc, *next_rxd;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4144
	struct e1000_buffer *buffer_info, *next_buffer;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4145
	unsigned long flags;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4146
	uint32_t length;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4147
	uint8_t last_byte;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4148
	unsigned int i;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4149
	int cleaned_count = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4150
	boolean_t cleaned = FALSE;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4151
	unsigned int total_rx_bytes=0, total_rx_packets=0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4152
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4153
	i = rx_ring->next_to_clean;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4154
	rx_desc = E1000_RX_DESC(*rx_ring, i);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4155
	buffer_info = &rx_ring->buffer_info[i];
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4156
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4157
	while (rx_desc->status & E1000_RXD_STAT_DD) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4158
		struct sk_buff *skb;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4159
		u8 status;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4160
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4161
#ifdef CONFIG_E1000_NAPI
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4162
		if (*work_done >= work_to_do)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4163
			break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4164
		(*work_done)++;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4165
#endif
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4166
		status = rx_desc->status;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4167
		skb = buffer_info->skb;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4168
		buffer_info->skb = NULL;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4169
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4170
		prefetch(skb->data - NET_IP_ALIGN);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4171
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4172
		if (++i == rx_ring->count) i = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4173
		next_rxd = E1000_RX_DESC(*rx_ring, i);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4174
		prefetch(next_rxd);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4175
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4176
		next_buffer = &rx_ring->buffer_info[i];
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4177
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4178
		cleaned = TRUE;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4179
		cleaned_count++;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4180
		pci_unmap_single(pdev,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4181
		                 buffer_info->dma,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4182
		                 buffer_info->length,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4183
		                 PCI_DMA_FROMDEVICE);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4184
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4185
		length = le16_to_cpu(rx_desc->length);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4186
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4187
		if (unlikely(!(status & E1000_RXD_STAT_EOP))) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4188
			/* All receives must fit into a single buffer */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4189
			E1000_DBG("%s: Receive packet consumed multiple"
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4190
				  " buffers\n", netdev->name);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4191
			/* recycle */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4192
			buffer_info->skb = skb;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4193
			goto next_desc;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4194
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4195
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4196
		if (unlikely(rx_desc->errors & E1000_RXD_ERR_FRAME_ERR_MASK)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4197
			last_byte = *(skb->data + length - 1);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4198
			if (TBI_ACCEPT(&adapter->hw, status,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4199
			              rx_desc->errors, length, last_byte)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4200
				spin_lock_irqsave(&adapter->stats_lock, flags);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4201
				e1000_tbi_adjust_stats(&adapter->hw,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4202
				                       &adapter->stats,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4203
				                       length, skb->data);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4204
				spin_unlock_irqrestore(&adapter->stats_lock,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4205
				                       flags);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4206
				length--;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4207
			} else {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4208
				/* recycle */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4209
				buffer_info->skb = skb;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4210
				goto next_desc;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4211
			}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4212
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4213
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4214
		/* adjust length to remove Ethernet CRC, this must be
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4215
		 * done after the TBI_ACCEPT workaround above */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4216
		length -= 4;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4217
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4218
		/* probably a little skewed due to removing CRC */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4219
		total_rx_bytes += length;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4220
		total_rx_packets++;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4221
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4222
		/* code added for copybreak, this should improve
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4223
		 * performance for small packets with large amounts
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4224
		 * of reassembly being done in the stack */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4225
		if (length < copybreak) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4226
			struct sk_buff *new_skb =
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4227
			    netdev_alloc_skb(netdev, length + NET_IP_ALIGN);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4228
			if (new_skb) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4229
				skb_reserve(new_skb, NET_IP_ALIGN);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4230
				skb_copy_to_linear_data_offset(new_skb,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4231
							       -NET_IP_ALIGN,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4232
							       (skb->data -
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4233
							        NET_IP_ALIGN),
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4234
							       (length +
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4235
							        NET_IP_ALIGN));
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4236
				/* save the skb in buffer_info as good */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4237
				buffer_info->skb = skb;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4238
				skb = new_skb;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4239
			}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4240
			/* else just continue with the old one */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4241
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4242
		/* end copybreak code */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4243
		skb_put(skb, length);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4244
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4245
		/* Receive Checksum Offload */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4246
		e1000_rx_checksum(adapter,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4247
				  (uint32_t)(status) |
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4248
				  ((uint32_t)(rx_desc->errors) << 24),
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4249
				  le16_to_cpu(rx_desc->csum), skb);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4250
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4251
		skb->protocol = eth_type_trans(skb, netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4252
#ifdef CONFIG_E1000_NAPI
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4253
		if (unlikely(adapter->vlgrp &&
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4254
			    (status & E1000_RXD_STAT_VP))) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4255
			vlan_hwaccel_receive_skb(skb, adapter->vlgrp,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4256
						 le16_to_cpu(rx_desc->special) &
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4257
						 E1000_RXD_SPC_VLAN_MASK);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4258
		} else {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4259
			netif_receive_skb(skb);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4260
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4261
#else /* CONFIG_E1000_NAPI */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4262
		if (unlikely(adapter->vlgrp &&
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4263
			    (status & E1000_RXD_STAT_VP))) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4264
			vlan_hwaccel_rx(skb, adapter->vlgrp,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4265
					le16_to_cpu(rx_desc->special) &
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4266
					E1000_RXD_SPC_VLAN_MASK);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4267
		} else {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4268
			netif_rx(skb);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4269
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4270
#endif /* CONFIG_E1000_NAPI */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4271
		netdev->last_rx = jiffies;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4272
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4273
next_desc:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4274
		rx_desc->status = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4275
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4276
		/* return some buffers to hardware, one at a time is too slow */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4277
		if (unlikely(cleaned_count >= E1000_RX_BUFFER_WRITE)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4278
			adapter->alloc_rx_buf(adapter, rx_ring, cleaned_count);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4279
			cleaned_count = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4280
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4281
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4282
		/* use prefetched values */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4283
		rx_desc = next_rxd;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4284
		buffer_info = next_buffer;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4285
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4286
	rx_ring->next_to_clean = i;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4287
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4288
	cleaned_count = E1000_DESC_UNUSED(rx_ring);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4289
	if (cleaned_count)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4290
		adapter->alloc_rx_buf(adapter, rx_ring, cleaned_count);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4291
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4292
	adapter->total_rx_packets += total_rx_packets;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4293
	adapter->total_rx_bytes += total_rx_bytes;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4294
	return cleaned;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4295
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4296
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4297
/**
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4298
 * e1000_clean_rx_irq_ps - Send received data up the network stack; packet split
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4299
 * @adapter: board private structure
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4300
 **/
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4301
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4302
static boolean_t
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4303
#ifdef CONFIG_E1000_NAPI
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4304
e1000_clean_rx_irq_ps(struct e1000_adapter *adapter,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4305
                      struct e1000_rx_ring *rx_ring,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4306
                      int *work_done, int work_to_do)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4307
#else
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4308
e1000_clean_rx_irq_ps(struct e1000_adapter *adapter,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4309
                      struct e1000_rx_ring *rx_ring)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4310
#endif
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4311
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4312
	union e1000_rx_desc_packet_split *rx_desc, *next_rxd;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4313
	struct net_device *netdev = adapter->netdev;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4314
	struct pci_dev *pdev = adapter->pdev;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4315
	struct e1000_buffer *buffer_info, *next_buffer;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4316
	struct e1000_ps_page *ps_page;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4317
	struct e1000_ps_page_dma *ps_page_dma;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4318
	struct sk_buff *skb;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4319
	unsigned int i, j;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4320
	uint32_t length, staterr;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4321
	int cleaned_count = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4322
	boolean_t cleaned = FALSE;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4323
	unsigned int total_rx_bytes=0, total_rx_packets=0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4324
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4325
	i = rx_ring->next_to_clean;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4326
	rx_desc = E1000_RX_DESC_PS(*rx_ring, i);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4327
	staterr = le32_to_cpu(rx_desc->wb.middle.status_error);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4328
	buffer_info = &rx_ring->buffer_info[i];
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4329
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4330
	while (staterr & E1000_RXD_STAT_DD) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4331
		ps_page = &rx_ring->ps_page[i];
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4332
		ps_page_dma = &rx_ring->ps_page_dma[i];
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4333
#ifdef CONFIG_E1000_NAPI
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4334
		if (unlikely(*work_done >= work_to_do))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4335
			break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4336
		(*work_done)++;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4337
#endif
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4338
		skb = buffer_info->skb;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4339
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4340
		/* in the packet split case this is header only */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4341
		prefetch(skb->data - NET_IP_ALIGN);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4342
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4343
		if (++i == rx_ring->count) i = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4344
		next_rxd = E1000_RX_DESC_PS(*rx_ring, i);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4345
		prefetch(next_rxd);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4346
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4347
		next_buffer = &rx_ring->buffer_info[i];
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4348
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4349
		cleaned = TRUE;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4350
		cleaned_count++;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4351
		pci_unmap_single(pdev, buffer_info->dma,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4352
				 buffer_info->length,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4353
				 PCI_DMA_FROMDEVICE);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4354
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4355
		if (unlikely(!(staterr & E1000_RXD_STAT_EOP))) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4356
			E1000_DBG("%s: Packet Split buffers didn't pick up"
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4357
				  " the full packet\n", netdev->name);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4358
			dev_kfree_skb_irq(skb);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4359
			goto next_desc;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4360
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4361
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4362
		if (unlikely(staterr & E1000_RXDEXT_ERR_FRAME_ERR_MASK)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4363
			dev_kfree_skb_irq(skb);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4364
			goto next_desc;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4365
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4366
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4367
		length = le16_to_cpu(rx_desc->wb.middle.length0);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4368
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4369
		if (unlikely(!length)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4370
			E1000_DBG("%s: Last part of the packet spanning"
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4371
				  " multiple descriptors\n", netdev->name);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4372
			dev_kfree_skb_irq(skb);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4373
			goto next_desc;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4374
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4375
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4376
		/* Good Receive */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4377
		skb_put(skb, length);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4378
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4379
		{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4380
		/* this looks ugly, but it seems compiler issues make it
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4381
		   more efficient than reusing j */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4382
		int l1 = le16_to_cpu(rx_desc->wb.upper.length[0]);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4383
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4384
		/* page alloc/put takes too long and effects small packet
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4385
		 * throughput, so unsplit small packets and save the alloc/put*/
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4386
		if (l1 && (l1 <= copybreak) && ((length + l1) <= adapter->rx_ps_bsize0)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4387
			u8 *vaddr;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4388
			/* there is no documentation about how to call
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4389
			 * kmap_atomic, so we can't hold the mapping
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4390
			 * very long */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4391
			pci_dma_sync_single_for_cpu(pdev,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4392
				ps_page_dma->ps_page_dma[0],
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4393
				PAGE_SIZE,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4394
				PCI_DMA_FROMDEVICE);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4395
			vaddr = kmap_atomic(ps_page->ps_page[0],
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4396
			                    KM_SKB_DATA_SOFTIRQ);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4397
			memcpy(skb_tail_pointer(skb), vaddr, l1);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4398
			kunmap_atomic(vaddr, KM_SKB_DATA_SOFTIRQ);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4399
			pci_dma_sync_single_for_device(pdev,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4400
				ps_page_dma->ps_page_dma[0],
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4401
				PAGE_SIZE, PCI_DMA_FROMDEVICE);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4402
			/* remove the CRC */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4403
			l1 -= 4;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4404
			skb_put(skb, l1);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4405
			goto copydone;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4406
		} /* if */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4407
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4408
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4409
		for (j = 0; j < adapter->rx_ps_pages; j++) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4410
			if (!(length= le16_to_cpu(rx_desc->wb.upper.length[j])))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4411
				break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4412
			pci_unmap_page(pdev, ps_page_dma->ps_page_dma[j],
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4413
					PAGE_SIZE, PCI_DMA_FROMDEVICE);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4414
			ps_page_dma->ps_page_dma[j] = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4415
			skb_fill_page_desc(skb, j, ps_page->ps_page[j], 0,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4416
			                   length);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4417
			ps_page->ps_page[j] = NULL;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4418
			skb->len += length;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4419
			skb->data_len += length;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4420
			skb->truesize += length;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4421
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4422
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4423
		/* strip the ethernet crc, problem is we're using pages now so
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4424
		 * this whole operation can get a little cpu intensive */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4425
		pskb_trim(skb, skb->len - 4);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4426
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4427
copydone:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4428
		total_rx_bytes += skb->len;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4429
		total_rx_packets++;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4430
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4431
		e1000_rx_checksum(adapter, staterr,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4432
				  le16_to_cpu(rx_desc->wb.lower.hi_dword.csum_ip.csum), skb);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4433
		skb->protocol = eth_type_trans(skb, netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4434
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4435
		if (likely(rx_desc->wb.upper.header_status &
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4436
			   cpu_to_le16(E1000_RXDPS_HDRSTAT_HDRSP)))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4437
			adapter->rx_hdr_split++;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4438
#ifdef CONFIG_E1000_NAPI
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4439
		if (unlikely(adapter->vlgrp && (staterr & E1000_RXD_STAT_VP))) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4440
			vlan_hwaccel_receive_skb(skb, adapter->vlgrp,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4441
				le16_to_cpu(rx_desc->wb.middle.vlan) &
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4442
				E1000_RXD_SPC_VLAN_MASK);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4443
		} else {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4444
			netif_receive_skb(skb);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4445
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4446
#else /* CONFIG_E1000_NAPI */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4447
		if (unlikely(adapter->vlgrp && (staterr & E1000_RXD_STAT_VP))) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4448
			vlan_hwaccel_rx(skb, adapter->vlgrp,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4449
				le16_to_cpu(rx_desc->wb.middle.vlan) &
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4450
				E1000_RXD_SPC_VLAN_MASK);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4451
		} else {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4452
			netif_rx(skb);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4453
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4454
#endif /* CONFIG_E1000_NAPI */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4455
		netdev->last_rx = jiffies;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4456
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4457
next_desc:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4458
		rx_desc->wb.middle.status_error &= cpu_to_le32(~0xFF);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4459
		buffer_info->skb = NULL;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4460
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4461
		/* return some buffers to hardware, one at a time is too slow */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4462
		if (unlikely(cleaned_count >= E1000_RX_BUFFER_WRITE)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4463
			adapter->alloc_rx_buf(adapter, rx_ring, cleaned_count);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4464
			cleaned_count = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4465
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4466
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4467
		/* use prefetched values */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4468
		rx_desc = next_rxd;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4469
		buffer_info = next_buffer;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4470
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4471
		staterr = le32_to_cpu(rx_desc->wb.middle.status_error);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4472
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4473
	rx_ring->next_to_clean = i;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4474
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4475
	cleaned_count = E1000_DESC_UNUSED(rx_ring);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4476
	if (cleaned_count)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4477
		adapter->alloc_rx_buf(adapter, rx_ring, cleaned_count);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4478
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4479
	adapter->total_rx_packets += total_rx_packets;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4480
	adapter->total_rx_bytes += total_rx_bytes;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4481
	return cleaned;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4482
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4483
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4484
/**
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4485
 * e1000_alloc_rx_buffers - Replace used receive buffers; legacy & extended
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4486
 * @adapter: address of board private structure
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4487
 **/
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4488
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4489
static void
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4490
e1000_alloc_rx_buffers(struct e1000_adapter *adapter,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4491
                       struct e1000_rx_ring *rx_ring,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4492
		       int cleaned_count)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4493
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4494
	struct net_device *netdev = adapter->netdev;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4495
	struct pci_dev *pdev = adapter->pdev;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4496
	struct e1000_rx_desc *rx_desc;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4497
	struct e1000_buffer *buffer_info;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4498
	struct sk_buff *skb;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4499
	unsigned int i;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4500
	unsigned int bufsz = adapter->rx_buffer_len + NET_IP_ALIGN;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4501
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4502
	i = rx_ring->next_to_use;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4503
	buffer_info = &rx_ring->buffer_info[i];
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4504
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4505
	while (cleaned_count--) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4506
		skb = buffer_info->skb;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4507
		if (skb) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4508
			skb_trim(skb, 0);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4509
			goto map_skb;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4510
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4511
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4512
		skb = netdev_alloc_skb(netdev, bufsz);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4513
		if (unlikely(!skb)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4514
			/* Better luck next round */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4515
			adapter->alloc_rx_buff_failed++;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4516
			break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4517
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4518
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4519
		/* Fix for errata 23, can't cross 64kB boundary */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4520
		if (!e1000_check_64k_bound(adapter, skb->data, bufsz)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4521
			struct sk_buff *oldskb = skb;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4522
			DPRINTK(RX_ERR, ERR, "skb align check failed: %u bytes "
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4523
					     "at %p\n", bufsz, skb->data);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4524
			/* Try again, without freeing the previous */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4525
			skb = netdev_alloc_skb(netdev, bufsz);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4526
			/* Failed allocation, critical failure */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4527
			if (!skb) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4528
				dev_kfree_skb(oldskb);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4529
				break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4530
			}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4531
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4532
			if (!e1000_check_64k_bound(adapter, skb->data, bufsz)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4533
				/* give up */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4534
				dev_kfree_skb(skb);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4535
				dev_kfree_skb(oldskb);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4536
				break; /* while !buffer_info->skb */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4537
			}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4538
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4539
			/* Use new allocation */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4540
			dev_kfree_skb(oldskb);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4541
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4542
		/* Make buffer alignment 2 beyond a 16 byte boundary
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4543
		 * this will result in a 16 byte aligned IP header after
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4544
		 * the 14 byte MAC header is removed
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4545
		 */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4546
		skb_reserve(skb, NET_IP_ALIGN);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4547
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4548
		buffer_info->skb = skb;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4549
		buffer_info->length = adapter->rx_buffer_len;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4550
map_skb:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4551
		buffer_info->dma = pci_map_single(pdev,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4552
						  skb->data,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4553
						  adapter->rx_buffer_len,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4554
						  PCI_DMA_FROMDEVICE);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4555
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4556
		/* Fix for errata 23, can't cross 64kB boundary */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4557
		if (!e1000_check_64k_bound(adapter,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4558
					(void *)(unsigned long)buffer_info->dma,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4559
					adapter->rx_buffer_len)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4560
			DPRINTK(RX_ERR, ERR,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4561
				"dma align check failed: %u bytes at %p\n",
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4562
				adapter->rx_buffer_len,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4563
				(void *)(unsigned long)buffer_info->dma);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4564
			dev_kfree_skb(skb);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4565
			buffer_info->skb = NULL;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4566
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4567
			pci_unmap_single(pdev, buffer_info->dma,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4568
					 adapter->rx_buffer_len,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4569
					 PCI_DMA_FROMDEVICE);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4570
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4571
			break; /* while !buffer_info->skb */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4572
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4573
		rx_desc = E1000_RX_DESC(*rx_ring, i);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4574
		rx_desc->buffer_addr = cpu_to_le64(buffer_info->dma);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4575
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4576
		if (unlikely(++i == rx_ring->count))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4577
			i = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4578
		buffer_info = &rx_ring->buffer_info[i];
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4579
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4580
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4581
	if (likely(rx_ring->next_to_use != i)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4582
		rx_ring->next_to_use = i;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4583
		if (unlikely(i-- == 0))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4584
			i = (rx_ring->count - 1);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4585
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4586
		/* Force memory writes to complete before letting h/w
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4587
		 * know there are new descriptors to fetch.  (Only
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4588
		 * applicable for weak-ordered memory model archs,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4589
		 * such as IA-64). */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4590
		wmb();
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4591
		writel(i, adapter->hw.hw_addr + rx_ring->rdt);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4592
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4593
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4594
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4595
/**
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4596
 * e1000_alloc_rx_buffers_ps - Replace used receive buffers; packet split
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4597
 * @adapter: address of board private structure
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4598
 **/
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4599
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4600
static void
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4601
e1000_alloc_rx_buffers_ps(struct e1000_adapter *adapter,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4602
                          struct e1000_rx_ring *rx_ring,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4603
			  int cleaned_count)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4604
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4605
	struct net_device *netdev = adapter->netdev;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4606
	struct pci_dev *pdev = adapter->pdev;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4607
	union e1000_rx_desc_packet_split *rx_desc;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4608
	struct e1000_buffer *buffer_info;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4609
	struct e1000_ps_page *ps_page;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4610
	struct e1000_ps_page_dma *ps_page_dma;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4611
	struct sk_buff *skb;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4612
	unsigned int i, j;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4613
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4614
	i = rx_ring->next_to_use;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4615
	buffer_info = &rx_ring->buffer_info[i];
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4616
	ps_page = &rx_ring->ps_page[i];
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4617
	ps_page_dma = &rx_ring->ps_page_dma[i];
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4618
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4619
	while (cleaned_count--) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4620
		rx_desc = E1000_RX_DESC_PS(*rx_ring, i);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4621
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4622
		for (j = 0; j < PS_PAGE_BUFFERS; j++) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4623
			if (j < adapter->rx_ps_pages) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4624
				if (likely(!ps_page->ps_page[j])) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4625
					ps_page->ps_page[j] =
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4626
						alloc_page(GFP_ATOMIC);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4627
					if (unlikely(!ps_page->ps_page[j])) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4628
						adapter->alloc_rx_buff_failed++;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4629
						goto no_buffers;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4630
					}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4631
					ps_page_dma->ps_page_dma[j] =
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4632
						pci_map_page(pdev,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4633
							    ps_page->ps_page[j],
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4634
							    0, PAGE_SIZE,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4635
							    PCI_DMA_FROMDEVICE);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4636
				}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4637
				/* Refresh the desc even if buffer_addrs didn't
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4638
				 * change because each write-back erases
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4639
				 * this info.
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4640
				 */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4641
				rx_desc->read.buffer_addr[j+1] =
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4642
				     cpu_to_le64(ps_page_dma->ps_page_dma[j]);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4643
			} else
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4644
				rx_desc->read.buffer_addr[j+1] = ~0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4645
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4646
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4647
		skb = netdev_alloc_skb(netdev,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4648
		                       adapter->rx_ps_bsize0 + NET_IP_ALIGN);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4649
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4650
		if (unlikely(!skb)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4651
			adapter->alloc_rx_buff_failed++;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4652
			break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4653
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4654
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4655
		/* Make buffer alignment 2 beyond a 16 byte boundary
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4656
		 * this will result in a 16 byte aligned IP header after
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4657
		 * the 14 byte MAC header is removed
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4658
		 */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4659
		skb_reserve(skb, NET_IP_ALIGN);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4660
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4661
		buffer_info->skb = skb;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4662
		buffer_info->length = adapter->rx_ps_bsize0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4663
		buffer_info->dma = pci_map_single(pdev, skb->data,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4664
						  adapter->rx_ps_bsize0,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4665
						  PCI_DMA_FROMDEVICE);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4666
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4667
		rx_desc->read.buffer_addr[0] = cpu_to_le64(buffer_info->dma);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4668
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4669
		if (unlikely(++i == rx_ring->count)) i = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4670
		buffer_info = &rx_ring->buffer_info[i];
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4671
		ps_page = &rx_ring->ps_page[i];
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4672
		ps_page_dma = &rx_ring->ps_page_dma[i];
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4673
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4674
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4675
no_buffers:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4676
	if (likely(rx_ring->next_to_use != i)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4677
		rx_ring->next_to_use = i;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4678
		if (unlikely(i-- == 0)) i = (rx_ring->count - 1);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4679
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4680
		/* Force memory writes to complete before letting h/w
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4681
		 * know there are new descriptors to fetch.  (Only
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4682
		 * applicable for weak-ordered memory model archs,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4683
		 * such as IA-64). */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4684
		wmb();
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4685
		/* Hardware increments by 16 bytes, but packet split
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4686
		 * descriptors are 32 bytes...so we increment tail
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4687
		 * twice as much.
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4688
		 */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4689
		writel(i<<1, adapter->hw.hw_addr + rx_ring->rdt);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4690
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4691
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4692
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4693
/**
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4694
 * e1000_smartspeed - Workaround for SmartSpeed on 82541 and 82547 controllers.
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4695
 * @adapter:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4696
 **/
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4697
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4698
static void
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4699
e1000_smartspeed(struct e1000_adapter *adapter)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4700
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4701
	uint16_t phy_status;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4702
	uint16_t phy_ctrl;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4703
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4704
	if ((adapter->hw.phy_type != e1000_phy_igp) || !adapter->hw.autoneg ||
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4705
	   !(adapter->hw.autoneg_advertised & ADVERTISE_1000_FULL))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4706
		return;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4707
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4708
	if (adapter->smartspeed == 0) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4709
		/* If Master/Slave config fault is asserted twice,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4710
		 * we assume back-to-back */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4711
		e1000_read_phy_reg(&adapter->hw, PHY_1000T_STATUS, &phy_status);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4712
		if (!(phy_status & SR_1000T_MS_CONFIG_FAULT)) return;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4713
		e1000_read_phy_reg(&adapter->hw, PHY_1000T_STATUS, &phy_status);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4714
		if (!(phy_status & SR_1000T_MS_CONFIG_FAULT)) return;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4715
		e1000_read_phy_reg(&adapter->hw, PHY_1000T_CTRL, &phy_ctrl);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4716
		if (phy_ctrl & CR_1000T_MS_ENABLE) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4717
			phy_ctrl &= ~CR_1000T_MS_ENABLE;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4718
			e1000_write_phy_reg(&adapter->hw, PHY_1000T_CTRL,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4719
					    phy_ctrl);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4720
			adapter->smartspeed++;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4721
			if (!e1000_phy_setup_autoneg(&adapter->hw) &&
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4722
			   !e1000_read_phy_reg(&adapter->hw, PHY_CTRL,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4723
				   	       &phy_ctrl)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4724
				phy_ctrl |= (MII_CR_AUTO_NEG_EN |
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4725
					     MII_CR_RESTART_AUTO_NEG);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4726
				e1000_write_phy_reg(&adapter->hw, PHY_CTRL,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4727
						    phy_ctrl);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4728
			}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4729
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4730
		return;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4731
	} else if (adapter->smartspeed == E1000_SMARTSPEED_DOWNSHIFT) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4732
		/* If still no link, perhaps using 2/3 pair cable */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4733
		e1000_read_phy_reg(&adapter->hw, PHY_1000T_CTRL, &phy_ctrl);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4734
		phy_ctrl |= CR_1000T_MS_ENABLE;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4735
		e1000_write_phy_reg(&adapter->hw, PHY_1000T_CTRL, phy_ctrl);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4736
		if (!e1000_phy_setup_autoneg(&adapter->hw) &&
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4737
		   !e1000_read_phy_reg(&adapter->hw, PHY_CTRL, &phy_ctrl)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4738
			phy_ctrl |= (MII_CR_AUTO_NEG_EN |
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4739
				     MII_CR_RESTART_AUTO_NEG);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4740
			e1000_write_phy_reg(&adapter->hw, PHY_CTRL, phy_ctrl);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4741
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4742
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4743
	/* Restart process after E1000_SMARTSPEED_MAX iterations */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4744
	if (adapter->smartspeed++ == E1000_SMARTSPEED_MAX)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4745
		adapter->smartspeed = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4746
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4747
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4748
/**
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4749
 * e1000_ioctl -
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4750
 * @netdev:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4751
 * @ifreq:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4752
 * @cmd:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4753
 **/
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4754
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4755
static int
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4756
e1000_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4757
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4758
	switch (cmd) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4759
	case SIOCGMIIPHY:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4760
	case SIOCGMIIREG:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4761
	case SIOCSMIIREG:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4762
		return e1000_mii_ioctl(netdev, ifr, cmd);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4763
	default:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4764
		return -EOPNOTSUPP;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4765
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4766
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4767
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4768
/**
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4769
 * e1000_mii_ioctl -
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4770
 * @netdev:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4771
 * @ifreq:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4772
 * @cmd:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4773
 **/
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4774
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4775
static int
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4776
e1000_mii_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4777
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4778
	struct e1000_adapter *adapter = netdev_priv(netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4779
	struct mii_ioctl_data *data = if_mii(ifr);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4780
	int retval;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4781
	uint16_t mii_reg;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4782
	uint16_t spddplx;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4783
	unsigned long flags;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4784
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4785
	if (adapter->hw.media_type != e1000_media_type_copper)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4786
		return -EOPNOTSUPP;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4787
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4788
	switch (cmd) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4789
	case SIOCGMIIPHY:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4790
		data->phy_id = adapter->hw.phy_addr;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4791
		break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4792
	case SIOCGMIIREG:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4793
		if (!capable(CAP_NET_ADMIN))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4794
			return -EPERM;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4795
		spin_lock_irqsave(&adapter->stats_lock, flags);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4796
		if (e1000_read_phy_reg(&adapter->hw, data->reg_num & 0x1F,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4797
				   &data->val_out)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4798
			spin_unlock_irqrestore(&adapter->stats_lock, flags);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4799
			return -EIO;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4800
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4801
		spin_unlock_irqrestore(&adapter->stats_lock, flags);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4802
		break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4803
	case SIOCSMIIREG:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4804
		if (!capable(CAP_NET_ADMIN))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4805
			return -EPERM;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4806
		if (data->reg_num & ~(0x1F))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4807
			return -EFAULT;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4808
		mii_reg = data->val_in;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4809
		spin_lock_irqsave(&adapter->stats_lock, flags);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4810
		if (e1000_write_phy_reg(&adapter->hw, data->reg_num,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4811
					mii_reg)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4812
			spin_unlock_irqrestore(&adapter->stats_lock, flags);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4813
			return -EIO;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4814
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4815
		if (adapter->hw.media_type == e1000_media_type_copper) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4816
			switch (data->reg_num) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4817
			case PHY_CTRL:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4818
				if (mii_reg & MII_CR_POWER_DOWN)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4819
					break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4820
				if (mii_reg & MII_CR_AUTO_NEG_EN) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4821
					adapter->hw.autoneg = 1;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4822
					adapter->hw.autoneg_advertised = 0x2F;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4823
				} else {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4824
					if (mii_reg & 0x40)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4825
						spddplx = SPEED_1000;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4826
					else if (mii_reg & 0x2000)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4827
						spddplx = SPEED_100;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4828
					else
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4829
						spddplx = SPEED_10;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4830
					spddplx += (mii_reg & 0x100)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4831
						   ? DUPLEX_FULL :
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4832
						   DUPLEX_HALF;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4833
					retval = e1000_set_spd_dplx(adapter,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4834
								    spddplx);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4835
					if (retval) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4836
						spin_unlock_irqrestore(
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4837
							&adapter->stats_lock,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4838
							flags);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4839
						return retval;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4840
					}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4841
				}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4842
				if (netif_running(adapter->netdev))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4843
					e1000_reinit_locked(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4844
				else
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4845
					e1000_reset(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4846
				break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4847
			case M88E1000_PHY_SPEC_CTRL:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4848
			case M88E1000_EXT_PHY_SPEC_CTRL:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4849
				if (e1000_phy_reset(&adapter->hw)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4850
					spin_unlock_irqrestore(
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4851
						&adapter->stats_lock, flags);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4852
					return -EIO;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4853
				}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4854
				break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4855
			}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4856
		} else {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4857
			switch (data->reg_num) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4858
			case PHY_CTRL:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4859
				if (mii_reg & MII_CR_POWER_DOWN)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4860
					break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4861
				if (netif_running(adapter->netdev))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4862
					e1000_reinit_locked(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4863
				else
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4864
					e1000_reset(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4865
				break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4866
			}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4867
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4868
		spin_unlock_irqrestore(&adapter->stats_lock, flags);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4869
		break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4870
	default:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4871
		return -EOPNOTSUPP;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4872
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4873
	return E1000_SUCCESS;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4874
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4875
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4876
void
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4877
e1000_pci_set_mwi(struct e1000_hw *hw)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4878
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4879
	struct e1000_adapter *adapter = hw->back;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4880
	int ret_val = pci_set_mwi(adapter->pdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4881
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4882
	if (ret_val)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4883
		DPRINTK(PROBE, ERR, "Error in setting MWI\n");
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4884
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4885
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4886
void
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4887
e1000_pci_clear_mwi(struct e1000_hw *hw)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4888
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4889
	struct e1000_adapter *adapter = hw->back;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4890
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4891
	pci_clear_mwi(adapter->pdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4892
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4893
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4894
void
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4895
e1000_read_pci_cfg(struct e1000_hw *hw, uint32_t reg, uint16_t *value)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4896
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4897
	struct e1000_adapter *adapter = hw->back;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4898
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4899
	pci_read_config_word(adapter->pdev, reg, value);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4900
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4901
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4902
void
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4903
e1000_write_pci_cfg(struct e1000_hw *hw, uint32_t reg, uint16_t *value)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4904
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4905
	struct e1000_adapter *adapter = hw->back;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4906
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4907
	pci_write_config_word(adapter->pdev, reg, *value);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4908
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4909
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4910
int32_t
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4911
e1000_read_pcie_cap_reg(struct e1000_hw *hw, uint32_t reg, uint16_t *value)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4912
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4913
    struct e1000_adapter *adapter = hw->back;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4914
    uint16_t cap_offset;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4915
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4916
    cap_offset = pci_find_capability(adapter->pdev, PCI_CAP_ID_EXP);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4917
    if (!cap_offset)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4918
        return -E1000_ERR_CONFIG;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4919
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4920
    pci_read_config_word(adapter->pdev, cap_offset + reg, value);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4921
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4922
    return E1000_SUCCESS;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4923
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4924
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4925
void
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4926
e1000_io_write(struct e1000_hw *hw, unsigned long port, uint32_t value)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4927
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4928
	outl(value, port);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4929
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4930
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4931
static void
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4932
e1000_vlan_rx_register(struct net_device *netdev, struct vlan_group *grp)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4933
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4934
	struct e1000_adapter *adapter = netdev_priv(netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4935
	uint32_t ctrl, rctl;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4936
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4937
	e1000_irq_disable(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4938
	adapter->vlgrp = grp;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4939
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4940
	if (grp) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4941
		/* enable VLAN tag insert/strip */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4942
		ctrl = E1000_READ_REG(&adapter->hw, CTRL);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4943
		ctrl |= E1000_CTRL_VME;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4944
		E1000_WRITE_REG(&adapter->hw, CTRL, ctrl);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4945
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4946
		if (adapter->hw.mac_type != e1000_ich8lan) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4947
			/* enable VLAN receive filtering */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4948
			rctl = E1000_READ_REG(&adapter->hw, RCTL);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4949
			rctl |= E1000_RCTL_VFE;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4950
			rctl &= ~E1000_RCTL_CFIEN;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4951
			E1000_WRITE_REG(&adapter->hw, RCTL, rctl);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4952
			e1000_update_mng_vlan(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4953
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4954
	} else {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4955
		/* disable VLAN tag insert/strip */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4956
		ctrl = E1000_READ_REG(&adapter->hw, CTRL);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4957
		ctrl &= ~E1000_CTRL_VME;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4958
		E1000_WRITE_REG(&adapter->hw, CTRL, ctrl);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4959
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4960
		if (adapter->hw.mac_type != e1000_ich8lan) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4961
			/* disable VLAN filtering */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4962
			rctl = E1000_READ_REG(&adapter->hw, RCTL);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4963
			rctl &= ~E1000_RCTL_VFE;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4964
			E1000_WRITE_REG(&adapter->hw, RCTL, rctl);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4965
			if (adapter->mng_vlan_id !=
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4966
			    (uint16_t)E1000_MNG_VLAN_NONE) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4967
				e1000_vlan_rx_kill_vid(netdev,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4968
				                       adapter->mng_vlan_id);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4969
				adapter->mng_vlan_id = E1000_MNG_VLAN_NONE;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4970
			}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4971
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4972
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4973
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4974
	e1000_irq_enable(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4975
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4976
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4977
static void
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4978
e1000_vlan_rx_add_vid(struct net_device *netdev, uint16_t vid)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4979
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4980
	struct e1000_adapter *adapter = netdev_priv(netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4981
	uint32_t vfta, index;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4982
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4983
	if ((adapter->hw.mng_cookie.status &
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4984
	     E1000_MNG_DHCP_COOKIE_STATUS_VLAN_SUPPORT) &&
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4985
	    (vid == adapter->mng_vlan_id))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4986
		return;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4987
	/* add VID to filter table */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4988
	index = (vid >> 5) & 0x7F;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4989
	vfta = E1000_READ_REG_ARRAY(&adapter->hw, VFTA, index);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4990
	vfta |= (1 << (vid & 0x1F));
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4991
	e1000_write_vfta(&adapter->hw, index, vfta);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4992
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4993
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4994
static void
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4995
e1000_vlan_rx_kill_vid(struct net_device *netdev, uint16_t vid)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4996
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4997
	struct e1000_adapter *adapter = netdev_priv(netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4998
	uint32_t vfta, index;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4999
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5000
	e1000_irq_disable(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5001
	vlan_group_set_device(adapter->vlgrp, vid, NULL);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5002
	e1000_irq_enable(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5003
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5004
	if ((adapter->hw.mng_cookie.status &
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5005
	     E1000_MNG_DHCP_COOKIE_STATUS_VLAN_SUPPORT) &&
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5006
	    (vid == adapter->mng_vlan_id)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5007
		/* release control to f/w */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5008
		e1000_release_hw_control(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5009
		return;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5010
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5011
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5012
	/* remove VID from filter table */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5013
	index = (vid >> 5) & 0x7F;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5014
	vfta = E1000_READ_REG_ARRAY(&adapter->hw, VFTA, index);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5015
	vfta &= ~(1 << (vid & 0x1F));
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5016
	e1000_write_vfta(&adapter->hw, index, vfta);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5017
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5018
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5019
static void
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5020
e1000_restore_vlan(struct e1000_adapter *adapter)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5021
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5022
	e1000_vlan_rx_register(adapter->netdev, adapter->vlgrp);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5023
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5024
	if (adapter->vlgrp) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5025
		uint16_t vid;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5026
		for (vid = 0; vid < VLAN_GROUP_ARRAY_LEN; vid++) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5027
			if (!vlan_group_get_device(adapter->vlgrp, vid))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5028
				continue;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5029
			e1000_vlan_rx_add_vid(adapter->netdev, vid);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5030
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5031
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5032
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5033
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5034
int
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5035
e1000_set_spd_dplx(struct e1000_adapter *adapter, uint16_t spddplx)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5036
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5037
	adapter->hw.autoneg = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5038
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5039
	/* Fiber NICs only allow 1000 gbps Full duplex */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5040
	if ((adapter->hw.media_type == e1000_media_type_fiber) &&
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5041
		spddplx != (SPEED_1000 + DUPLEX_FULL)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5042
		DPRINTK(PROBE, ERR, "Unsupported Speed/Duplex configuration\n");
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5043
		return -EINVAL;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5044
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5045
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5046
	switch (spddplx) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5047
	case SPEED_10 + DUPLEX_HALF:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5048
		adapter->hw.forced_speed_duplex = e1000_10_half;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5049
		break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5050
	case SPEED_10 + DUPLEX_FULL:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5051
		adapter->hw.forced_speed_duplex = e1000_10_full;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5052
		break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5053
	case SPEED_100 + DUPLEX_HALF:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5054
		adapter->hw.forced_speed_duplex = e1000_100_half;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5055
		break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5056
	case SPEED_100 + DUPLEX_FULL:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5057
		adapter->hw.forced_speed_duplex = e1000_100_full;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5058
		break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5059
	case SPEED_1000 + DUPLEX_FULL:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5060
		adapter->hw.autoneg = 1;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5061
		adapter->hw.autoneg_advertised = ADVERTISE_1000_FULL;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5062
		break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5063
	case SPEED_1000 + DUPLEX_HALF: /* not supported */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5064
	default:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5065
		DPRINTK(PROBE, ERR, "Unsupported Speed/Duplex configuration\n");
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5066
		return -EINVAL;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5067
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5068
	return 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5069
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5070
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5071
static int
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5072
e1000_suspend(struct pci_dev *pdev, pm_message_t state)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5073
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5074
	struct net_device *netdev = pci_get_drvdata(pdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5075
	struct e1000_adapter *adapter = netdev_priv(netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5076
	uint32_t ctrl, ctrl_ext, rctl, status;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5077
	uint32_t wufc = adapter->wol;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5078
#ifdef CONFIG_PM
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5079
	int retval = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5080
#endif
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5081
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5082
	netif_device_detach(netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5083
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5084
	if (netif_running(netdev)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5085
		WARN_ON(test_bit(__E1000_RESETTING, &adapter->flags));
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5086
		e1000_down(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5087
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5088
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5089
#ifdef CONFIG_PM
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5090
	retval = pci_save_state(pdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5091
	if (retval)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5092
		return retval;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5093
#endif
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5094
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5095
	status = E1000_READ_REG(&adapter->hw, STATUS);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5096
	if (status & E1000_STATUS_LU)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5097
		wufc &= ~E1000_WUFC_LNKC;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5098
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5099
	if (wufc) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5100
		e1000_setup_rctl(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5101
		e1000_set_multi(netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5102
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5103
		/* turn on all-multi mode if wake on multicast is enabled */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5104
		if (wufc & E1000_WUFC_MC) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5105
			rctl = E1000_READ_REG(&adapter->hw, RCTL);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5106
			rctl |= E1000_RCTL_MPE;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5107
			E1000_WRITE_REG(&adapter->hw, RCTL, rctl);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5108
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5109
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5110
		if (adapter->hw.mac_type >= e1000_82540) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5111
			ctrl = E1000_READ_REG(&adapter->hw, CTRL);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5112
			/* advertise wake from D3Cold */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5113
			#define E1000_CTRL_ADVD3WUC 0x00100000
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5114
			/* phy power management enable */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5115
			#define E1000_CTRL_EN_PHY_PWR_MGMT 0x00200000
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5116
			ctrl |= E1000_CTRL_ADVD3WUC |
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5117
				E1000_CTRL_EN_PHY_PWR_MGMT;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5118
			E1000_WRITE_REG(&adapter->hw, CTRL, ctrl);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5119
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5120
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5121
		if (adapter->hw.media_type == e1000_media_type_fiber ||
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5122
		   adapter->hw.media_type == e1000_media_type_internal_serdes) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5123
			/* keep the laser running in D3 */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5124
			ctrl_ext = E1000_READ_REG(&adapter->hw, CTRL_EXT);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5125
			ctrl_ext |= E1000_CTRL_EXT_SDP7_DATA;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5126
			E1000_WRITE_REG(&adapter->hw, CTRL_EXT, ctrl_ext);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5127
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5128
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5129
		/* Allow time for pending master requests to run */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5130
		e1000_disable_pciex_master(&adapter->hw);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5131
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5132
		E1000_WRITE_REG(&adapter->hw, WUC, E1000_WUC_PME_EN);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5133
		E1000_WRITE_REG(&adapter->hw, WUFC, wufc);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5134
		pci_enable_wake(pdev, PCI_D3hot, 1);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5135
		pci_enable_wake(pdev, PCI_D3cold, 1);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5136
	} else {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5137
		E1000_WRITE_REG(&adapter->hw, WUC, 0);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5138
		E1000_WRITE_REG(&adapter->hw, WUFC, 0);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5139
		pci_enable_wake(pdev, PCI_D3hot, 0);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5140
		pci_enable_wake(pdev, PCI_D3cold, 0);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5141
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5142
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5143
	e1000_release_manageability(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5144
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5145
	/* make sure adapter isn't asleep if manageability is enabled */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5146
	if (adapter->en_mng_pt) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5147
		pci_enable_wake(pdev, PCI_D3hot, 1);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5148
		pci_enable_wake(pdev, PCI_D3cold, 1);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5149
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5150
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5151
	if (adapter->hw.phy_type == e1000_phy_igp_3)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5152
		e1000_phy_powerdown_workaround(&adapter->hw);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5153
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5154
	if (netif_running(netdev))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5155
		e1000_free_irq(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5156
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5157
	/* Release control of h/w to f/w.  If f/w is AMT enabled, this
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5158
	 * would have already happened in close and is redundant. */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5159
	e1000_release_hw_control(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5160
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5161
	pci_disable_device(pdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5162
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5163
	pci_set_power_state(pdev, pci_choose_state(pdev, state));
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5164
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5165
	return 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5166
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5167
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5168
#ifdef CONFIG_PM
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5169
static int
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5170
e1000_resume(struct pci_dev *pdev)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5171
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5172
	struct net_device *netdev = pci_get_drvdata(pdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5173
	struct e1000_adapter *adapter = netdev_priv(netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5174
	uint32_t err;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5175
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5176
	pci_set_power_state(pdev, PCI_D0);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5177
	pci_restore_state(pdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5178
	if ((err = pci_enable_device(pdev))) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5179
		printk(KERN_ERR "e1000: Cannot enable PCI device from suspend\n");
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5180
		return err;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5181
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5182
	pci_set_master(pdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5183
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5184
	pci_enable_wake(pdev, PCI_D3hot, 0);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5185
	pci_enable_wake(pdev, PCI_D3cold, 0);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5186
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5187
	if (netif_running(netdev) && (err = e1000_request_irq(adapter)))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5188
		return err;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5189
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5190
	e1000_power_up_phy(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5191
	e1000_reset(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5192
	E1000_WRITE_REG(&adapter->hw, WUS, ~0);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5193
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5194
	e1000_init_manageability(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5195
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5196
	if (netif_running(netdev))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5197
		e1000_up(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5198
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5199
	netif_device_attach(netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5200
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5201
	/* If the controller is 82573 and f/w is AMT, do not set
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5202
	 * DRV_LOAD until the interface is up.  For all other cases,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5203
	 * let the f/w know that the h/w is now under the control
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5204
	 * of the driver. */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5205
	if (adapter->hw.mac_type != e1000_82573 ||
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5206
	    !e1000_check_mng_mode(&adapter->hw))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5207
		e1000_get_hw_control(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5208
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5209
	return 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5210
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5211
#endif
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5212
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5213
static void e1000_shutdown(struct pci_dev *pdev)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5214
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5215
	e1000_suspend(pdev, PMSG_SUSPEND);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5216
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5217
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5218
#ifdef CONFIG_NET_POLL_CONTROLLER
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5219
/*
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5220
 * Polling 'interrupt' - used by things like netconsole to send skbs
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5221
 * without having to re-enable interrupts. It's not called while
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5222
 * the interrupt routine is executing.
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5223
 */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5224
static void
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5225
e1000_netpoll(struct net_device *netdev)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5226
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5227
	struct e1000_adapter *adapter = netdev_priv(netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5228
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5229
	disable_irq(adapter->pdev->irq);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5230
	e1000_intr(adapter->pdev->irq, netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5231
	e1000_clean_tx_irq(adapter, adapter->tx_ring);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5232
#ifndef CONFIG_E1000_NAPI
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5233
	adapter->clean_rx(adapter, adapter->rx_ring);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5234
#endif
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5235
	enable_irq(adapter->pdev->irq);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5236
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5237
#endif
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5238
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5239
/**
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5240
 * e1000_io_error_detected - called when PCI error is detected
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5241
 * @pdev: Pointer to PCI device
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5242
 * @state: The current pci conneection state
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5243
 *
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5244
 * This function is called after a PCI bus error affecting
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5245
 * this device has been detected.
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5246
 */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5247
static pci_ers_result_t e1000_io_error_detected(struct pci_dev *pdev, pci_channel_state_t state)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5248
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5249
	struct net_device *netdev = pci_get_drvdata(pdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5250
	struct e1000_adapter *adapter = netdev->priv;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5251
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5252
	netif_device_detach(netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5253
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5254
	if (netif_running(netdev))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5255
		e1000_down(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5256
	pci_disable_device(pdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5257
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5258
	/* Request a slot slot reset. */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5259
	return PCI_ERS_RESULT_NEED_RESET;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5260
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5261
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5262
/**
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5263
 * e1000_io_slot_reset - called after the pci bus has been reset.
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5264
 * @pdev: Pointer to PCI device
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5265
 *
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5266
 * Restart the card from scratch, as if from a cold-boot. Implementation
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5267
 * resembles the first-half of the e1000_resume routine.
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5268
 */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5269
static pci_ers_result_t e1000_io_slot_reset(struct pci_dev *pdev)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5270
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5271
	struct net_device *netdev = pci_get_drvdata(pdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5272
	struct e1000_adapter *adapter = netdev->priv;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5273
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5274
	if (pci_enable_device(pdev)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5275
		printk(KERN_ERR "e1000: Cannot re-enable PCI device after reset.\n");
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5276
		return PCI_ERS_RESULT_DISCONNECT;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5277
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5278
	pci_set_master(pdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5279
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5280
	pci_enable_wake(pdev, PCI_D3hot, 0);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5281
	pci_enable_wake(pdev, PCI_D3cold, 0);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5282
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5283
	e1000_reset(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5284
	E1000_WRITE_REG(&adapter->hw, WUS, ~0);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5285
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5286
	return PCI_ERS_RESULT_RECOVERED;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5287
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5288
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5289
/**
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5290
 * e1000_io_resume - called when traffic can start flowing again.
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5291
 * @pdev: Pointer to PCI device
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5292
 *
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5293
 * This callback is called when the error recovery driver tells us that
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5294
 * its OK to resume normal operation. Implementation resembles the
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5295
 * second-half of the e1000_resume routine.
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5296
 */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5297
static void e1000_io_resume(struct pci_dev *pdev)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5298
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5299
	struct net_device *netdev = pci_get_drvdata(pdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5300
	struct e1000_adapter *adapter = netdev->priv;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5301
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5302
	e1000_init_manageability(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5303
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5304
	if (netif_running(netdev)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5305
		if (e1000_up(adapter)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5306
			printk("e1000: can't bring device back up after reset\n");
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5307
			return;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5308
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5309
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5310
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5311
	netif_device_attach(netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5312
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5313
	/* If the controller is 82573 and f/w is AMT, do not set
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5314
	 * DRV_LOAD until the interface is up.  For all other cases,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5315
	 * let the f/w know that the h/w is now under the control
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5316
	 * of the driver. */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5317
	if (adapter->hw.mac_type != e1000_82573 ||
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5318
	    !e1000_check_mng_mode(&adapter->hw))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5319
		e1000_get_hw_control(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5320
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5321
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5322
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5323
/* e1000_main.c */