devices/e1000e/netdev-2.6.37-ethercat.c
author Patrick Bruenn <p.bruenn@beckhoff.com>
Tue, 12 Apr 2016 11:17:36 +0200
branchstable-1.5
changeset 2654 b3f6b3e5ef29
parent 2582 87e502828b3f
permissions -rw-r--r--
devices/ccat: revert "limit rx processing to one frame per poll"

revert "limit rx processing to one frame per poll", which caused etherlab
frame timeouts in setups with more than one frame per cycle.
2219
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     1
/*******************************************************************************
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     2
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     3
  Intel PRO/1000 Linux driver
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     4
  Copyright(c) 1999 - 2010 Intel Corporation.
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     5
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     6
  This program is free software; you can redistribute it and/or modify it
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     7
  under the terms and conditions of the GNU General Public License,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     8
  version 2, as published by the Free Software Foundation.
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     9
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    10
  This program is distributed in the hope it will be useful, but WITHOUT
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    11
  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    12
  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    13
  more details.
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    14
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    15
  You should have received a copy of the GNU General Public License along with
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    16
  this program; if not, write to the Free Software Foundation, Inc.,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    17
  51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    18
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    19
  The full GNU General Public License is included in this distribution in
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    20
  the file called "COPYING".
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    21
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    22
  Contact Information:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    23
  Linux NICS <linux.nics@intel.com>
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    24
  e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    25
  Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    26
2473
f62b64fdbc23 Fixed e1000_open() in e1000e drivers.
Florian Pose <fp@igh-essen.com>
parents: 2472
diff changeset
    27
  vim: noexpandtab
f62b64fdbc23 Fixed e1000_open() in e1000e drivers.
Florian Pose <fp@igh-essen.com>
parents: 2472
diff changeset
    28
2219
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    29
*******************************************************************************/
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    30
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    31
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    32
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    33
#include <linux/module.h>
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    34
#include <linux/types.h>
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    35
#include <linux/init.h>
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    36
#include <linux/pci.h>
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    37
#include <linux/vmalloc.h>
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    38
#include <linux/pagemap.h>
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    39
#include <linux/delay.h>
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    40
#include <linux/netdevice.h>
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    41
#include <linux/tcp.h>
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    42
#include <linux/ipv6.h>
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    43
#include <linux/slab.h>
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    44
#include <net/checksum.h>
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    45
#include <net/ip6_checksum.h>
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    46
#include <linux/mii.h>
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    47
#include <linux/ethtool.h>
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    48
#include <linux/if_vlan.h>
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    49
#include <linux/cpu.h>
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    50
#include <linux/smp.h>
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    51
#include <linux/pm_qos_params.h>
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    52
#include <linux/pm_runtime.h>
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    53
#include <linux/aer.h>
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    54
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    55
#include "e1000-2.6.37-ethercat.h"
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    56
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    57
#define DRV_EXTRAVERSION "-k2-EtherCAT"
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    58
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    59
#define DRV_VERSION "1.2.7" DRV_EXTRAVERSION
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    60
char e1000e_driver_name[] = "ec_e1000e";
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    61
const char e1000e_driver_version[] = DRV_VERSION;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    62
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    63
static const struct e1000_info *e1000_info_tbl[] = {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    64
	[board_82571]		= &e1000_82571_info,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    65
	[board_82572]		= &e1000_82572_info,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    66
	[board_82573]		= &e1000_82573_info,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    67
	[board_82574]		= &e1000_82574_info,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    68
	[board_82583]		= &e1000_82583_info,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    69
	[board_80003es2lan]	= &e1000_es2_info,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    70
	[board_ich8lan]		= &e1000_ich8_info,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    71
	[board_ich9lan]		= &e1000_ich9_info,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    72
	[board_ich10lan]	= &e1000_ich10_info,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    73
	[board_pchlan]		= &e1000_pch_info,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    74
	[board_pch2lan]		= &e1000_pch2_info,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    75
};
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    76
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    77
struct e1000_reg_info {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    78
	u32 ofs;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    79
	char *name;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    80
};
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    81
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    82
#define E1000_RDFH	0x02410 /* Rx Data FIFO Head - RW */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    83
#define E1000_RDFT	0x02418 /* Rx Data FIFO Tail - RW */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    84
#define E1000_RDFHS	0x02420 /* Rx Data FIFO Head Saved - RW */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    85
#define E1000_RDFTS	0x02428 /* Rx Data FIFO Tail Saved - RW */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    86
#define E1000_RDFPC	0x02430 /* Rx Data FIFO Packet Count - RW */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    87
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    88
#define E1000_TDFH	0x03410 /* Tx Data FIFO Head - RW */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    89
#define E1000_TDFT	0x03418 /* Tx Data FIFO Tail - RW */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    90
#define E1000_TDFHS	0x03420 /* Tx Data FIFO Head Saved - RW */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    91
#define E1000_TDFTS	0x03428 /* Tx Data FIFO Tail Saved - RW */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    92
#define E1000_TDFPC	0x03430 /* Tx Data FIFO Packet Count - RW */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    93
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    94
static const struct e1000_reg_info e1000_reg_info_tbl[] = {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    95
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    96
	/* General Registers */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    97
	{E1000_CTRL, "CTRL"},
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    98
	{E1000_STATUS, "STATUS"},
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    99
	{E1000_CTRL_EXT, "CTRL_EXT"},
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   100
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   101
	/* Interrupt Registers */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   102
	{E1000_ICR, "ICR"},
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   103
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   104
	/* RX Registers */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   105
	{E1000_RCTL, "RCTL"},
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   106
	{E1000_RDLEN, "RDLEN"},
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   107
	{E1000_RDH, "RDH"},
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   108
	{E1000_RDT, "RDT"},
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   109
	{E1000_RDTR, "RDTR"},
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   110
	{E1000_RXDCTL(0), "RXDCTL"},
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   111
	{E1000_ERT, "ERT"},
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   112
	{E1000_RDBAL, "RDBAL"},
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   113
	{E1000_RDBAH, "RDBAH"},
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   114
	{E1000_RDFH, "RDFH"},
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   115
	{E1000_RDFT, "RDFT"},
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   116
	{E1000_RDFHS, "RDFHS"},
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   117
	{E1000_RDFTS, "RDFTS"},
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   118
	{E1000_RDFPC, "RDFPC"},
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   119
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   120
	/* TX Registers */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   121
	{E1000_TCTL, "TCTL"},
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   122
	{E1000_TDBAL, "TDBAL"},
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   123
	{E1000_TDBAH, "TDBAH"},
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   124
	{E1000_TDLEN, "TDLEN"},
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   125
	{E1000_TDH, "TDH"},
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   126
	{E1000_TDT, "TDT"},
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   127
	{E1000_TIDV, "TIDV"},
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   128
	{E1000_TXDCTL(0), "TXDCTL"},
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   129
	{E1000_TADV, "TADV"},
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   130
	{E1000_TARC(0), "TARC"},
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   131
	{E1000_TDFH, "TDFH"},
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   132
	{E1000_TDFT, "TDFT"},
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   133
	{E1000_TDFHS, "TDFHS"},
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   134
	{E1000_TDFTS, "TDFTS"},
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   135
	{E1000_TDFPC, "TDFPC"},
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   136
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   137
	/* List Terminator */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   138
	{}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   139
};
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   140
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   141
/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   142
 * e1000_regdump - register printout routine
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   143
 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   144
static void e1000_regdump(struct e1000_hw *hw, struct e1000_reg_info *reginfo)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   145
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   146
	int n = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   147
	char rname[16];
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   148
	u32 regs[8];
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   149
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   150
	switch (reginfo->ofs) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   151
	case E1000_RXDCTL(0):
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   152
		for (n = 0; n < 2; n++)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   153
			regs[n] = __er32(hw, E1000_RXDCTL(n));
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   154
		break;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   155
	case E1000_TXDCTL(0):
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   156
		for (n = 0; n < 2; n++)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   157
			regs[n] = __er32(hw, E1000_TXDCTL(n));
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   158
		break;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   159
	case E1000_TARC(0):
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   160
		for (n = 0; n < 2; n++)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   161
			regs[n] = __er32(hw, E1000_TARC(n));
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   162
		break;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   163
	default:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   164
		printk(KERN_INFO "%-15s %08x\n",
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   165
			reginfo->name, __er32(hw, reginfo->ofs));
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   166
		return;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   167
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   168
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   169
	snprintf(rname, 16, "%s%s", reginfo->name, "[0-1]");
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   170
	printk(KERN_INFO "%-15s ", rname);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   171
	for (n = 0; n < 2; n++)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   172
		printk(KERN_CONT "%08x ", regs[n]);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   173
	printk(KERN_CONT "\n");
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   174
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   175
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   176
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   177
/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   178
 * e1000e_dump - Print registers, tx-ring and rx-ring
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   179
 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   180
static void e1000e_dump(struct e1000_adapter *adapter)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   181
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   182
	struct net_device *netdev = adapter->netdev;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   183
	struct e1000_hw *hw = &adapter->hw;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   184
	struct e1000_reg_info *reginfo;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   185
	struct e1000_ring *tx_ring = adapter->tx_ring;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   186
	struct e1000_tx_desc *tx_desc;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   187
	struct my_u0 { u64 a; u64 b; } *u0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   188
	struct e1000_buffer *buffer_info;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   189
	struct e1000_ring *rx_ring = adapter->rx_ring;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   190
	union e1000_rx_desc_packet_split *rx_desc_ps;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   191
	struct e1000_rx_desc *rx_desc;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   192
	struct my_u1 { u64 a; u64 b; u64 c; u64 d; } *u1;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   193
	u32 staterr;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   194
	int i = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   195
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   196
	if (!netif_msg_hw(adapter))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   197
		return;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   198
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   199
	/* Print netdevice Info */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   200
	if (netdev) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   201
		dev_info(&adapter->pdev->dev, "Net device Info\n");
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   202
		printk(KERN_INFO "Device Name     state            "
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   203
			"trans_start      last_rx\n");
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   204
		printk(KERN_INFO "%-15s %016lX %016lX %016lX\n",
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   205
			netdev->name,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   206
			netdev->state,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   207
			netdev->trans_start,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   208
			netdev->last_rx);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   209
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   210
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   211
	/* Print Registers */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   212
	dev_info(&adapter->pdev->dev, "Register Dump\n");
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   213
	printk(KERN_INFO " Register Name   Value\n");
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   214
	for (reginfo = (struct e1000_reg_info *)e1000_reg_info_tbl;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   215
	     reginfo->name; reginfo++) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   216
		e1000_regdump(hw, reginfo);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   217
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   218
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   219
	/* Print TX Ring Summary */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   220
	if (!netdev || !netif_running(netdev))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   221
		goto exit;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   222
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   223
	dev_info(&adapter->pdev->dev, "TX Rings Summary\n");
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   224
	printk(KERN_INFO "Queue [NTU] [NTC] [bi(ntc)->dma  ]"
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   225
		" leng ntw timestamp\n");
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   226
	buffer_info = &tx_ring->buffer_info[tx_ring->next_to_clean];
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   227
	printk(KERN_INFO " %5d %5X %5X %016llX %04X %3X %016llX\n",
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   228
		0, tx_ring->next_to_use, tx_ring->next_to_clean,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   229
		(unsigned long long)buffer_info->dma,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   230
		buffer_info->length,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   231
		buffer_info->next_to_watch,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   232
		(unsigned long long)buffer_info->time_stamp);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   233
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   234
	/* Print TX Rings */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   235
	if (!netif_msg_tx_done(adapter))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   236
		goto rx_ring_summary;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   237
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   238
	dev_info(&adapter->pdev->dev, "TX Rings Dump\n");
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   239
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   240
	/* Transmit Descriptor Formats - DEXT[29] is 0 (Legacy) or 1 (Extended)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   241
	 *
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   242
	 * Legacy Transmit Descriptor
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   243
	 *   +--------------------------------------------------------------+
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   244
	 * 0 |         Buffer Address [63:0] (Reserved on Write Back)       |
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   245
	 *   +--------------------------------------------------------------+
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   246
	 * 8 | Special  |    CSS     | Status |  CMD    |  CSO   |  Length  |
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   247
	 *   +--------------------------------------------------------------+
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   248
	 *   63       48 47        36 35    32 31     24 23    16 15        0
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   249
	 *
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   250
	 * Extended Context Descriptor (DTYP=0x0) for TSO or checksum offload
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   251
	 *   63      48 47    40 39       32 31             16 15    8 7      0
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   252
	 *   +----------------------------------------------------------------+
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   253
	 * 0 |  TUCSE  | TUCS0  |   TUCSS   |     IPCSE       | IPCS0 | IPCSS |
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   254
	 *   +----------------------------------------------------------------+
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   255
	 * 8 |   MSS   | HDRLEN | RSV | STA | TUCMD | DTYP |      PAYLEN      |
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   256
	 *   +----------------------------------------------------------------+
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   257
	 *   63      48 47    40 39 36 35 32 31   24 23  20 19                0
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   258
	 *
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   259
	 * Extended Data Descriptor (DTYP=0x1)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   260
	 *   +----------------------------------------------------------------+
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   261
	 * 0 |                     Buffer Address [63:0]                      |
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   262
	 *   +----------------------------------------------------------------+
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   263
	 * 8 | VLAN tag |  POPTS  | Rsvd | Status | Command | DTYP |  DTALEN  |
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   264
	 *   +----------------------------------------------------------------+
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   265
	 *   63       48 47     40 39  36 35    32 31     24 23  20 19        0
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   266
	 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   267
	printk(KERN_INFO "Tl[desc]     [address 63:0  ] [SpeCssSCmCsLen]"
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   268
		" [bi->dma       ] leng  ntw timestamp        bi->skb "
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   269
		"<-- Legacy format\n");
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   270
	printk(KERN_INFO "Tc[desc]     [Ce CoCsIpceCoS] [MssHlRSCm0Plen]"
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   271
		" [bi->dma       ] leng  ntw timestamp        bi->skb "
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   272
		"<-- Ext Context format\n");
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   273
	printk(KERN_INFO "Td[desc]     [address 63:0  ] [VlaPoRSCm1Dlen]"
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   274
		" [bi->dma       ] leng  ntw timestamp        bi->skb "
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   275
		"<-- Ext Data format\n");
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   276
	for (i = 0; tx_ring->desc && (i < tx_ring->count); i++) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   277
		tx_desc = E1000_TX_DESC(*tx_ring, i);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   278
		buffer_info = &tx_ring->buffer_info[i];
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   279
		u0 = (struct my_u0 *)tx_desc;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   280
		printk(KERN_INFO "T%c[0x%03X]    %016llX %016llX %016llX "
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   281
			"%04X  %3X %016llX %p",
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   282
		       (!(le64_to_cpu(u0->b) & (1<<29)) ? 'l' :
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   283
			((le64_to_cpu(u0->b) & (1<<20)) ? 'd' : 'c')), i,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   284
		       (unsigned long long)le64_to_cpu(u0->a),
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   285
		       (unsigned long long)le64_to_cpu(u0->b),
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   286
		       (unsigned long long)buffer_info->dma,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   287
		       buffer_info->length, buffer_info->next_to_watch,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   288
		       (unsigned long long)buffer_info->time_stamp,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   289
		       buffer_info->skb);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   290
		if (i == tx_ring->next_to_use && i == tx_ring->next_to_clean)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   291
			printk(KERN_CONT " NTC/U\n");
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   292
		else if (i == tx_ring->next_to_use)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   293
			printk(KERN_CONT " NTU\n");
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   294
		else if (i == tx_ring->next_to_clean)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   295
			printk(KERN_CONT " NTC\n");
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   296
		else
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   297
			printk(KERN_CONT "\n");
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   298
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   299
		if (netif_msg_pktdata(adapter) && buffer_info->dma != 0)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   300
			print_hex_dump(KERN_INFO, "", DUMP_PREFIX_ADDRESS,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   301
					16, 1, phys_to_virt(buffer_info->dma),
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   302
					buffer_info->length, true);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   303
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   304
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   305
	/* Print RX Rings Summary */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   306
rx_ring_summary:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   307
	dev_info(&adapter->pdev->dev, "RX Rings Summary\n");
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   308
	printk(KERN_INFO "Queue [NTU] [NTC]\n");
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   309
	printk(KERN_INFO " %5d %5X %5X\n", 0,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   310
		rx_ring->next_to_use, rx_ring->next_to_clean);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   311
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   312
	/* Print RX Rings */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   313
	if (!netif_msg_rx_status(adapter))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   314
		goto exit;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   315
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   316
	dev_info(&adapter->pdev->dev, "RX Rings Dump\n");
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   317
	switch (adapter->rx_ps_pages) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   318
	case 1:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   319
	case 2:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   320
	case 3:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   321
		/* [Extended] Packet Split Receive Descriptor Format
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   322
		 *
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   323
		 *    +-----------------------------------------------------+
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   324
		 *  0 |                Buffer Address 0 [63:0]              |
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   325
		 *    +-----------------------------------------------------+
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   326
		 *  8 |                Buffer Address 1 [63:0]              |
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   327
		 *    +-----------------------------------------------------+
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   328
		 * 16 |                Buffer Address 2 [63:0]              |
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   329
		 *    +-----------------------------------------------------+
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   330
		 * 24 |                Buffer Address 3 [63:0]              |
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   331
		 *    +-----------------------------------------------------+
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   332
		 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   333
		printk(KERN_INFO "R  [desc]      [buffer 0 63:0 ] "
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   334
			"[buffer 1 63:0 ] "
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   335
		       "[buffer 2 63:0 ] [buffer 3 63:0 ] [bi->dma       ] "
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   336
		       "[bi->skb] <-- Ext Pkt Split format\n");
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   337
		/* [Extended] Receive Descriptor (Write-Back) Format
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   338
		 *
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   339
		 *   63       48 47    32 31     13 12    8 7    4 3        0
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   340
		 *   +------------------------------------------------------+
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   341
		 * 0 | Packet   | IP     |  Rsvd   | MRQ   | Rsvd | MRQ RSS |
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   342
		 *   | Checksum | Ident  |         | Queue |      |  Type   |
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   343
		 *   +------------------------------------------------------+
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   344
		 * 8 | VLAN Tag | Length | Extended Error | Extended Status |
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   345
		 *   +------------------------------------------------------+
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   346
		 *   63       48 47    32 31            20 19               0
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   347
		 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   348
		printk(KERN_INFO "RWB[desc]      [ck ipid mrqhsh] "
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   349
			"[vl   l0 ee  es] "
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   350
		       "[ l3  l2  l1 hs] [reserved      ] ---------------- "
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   351
		       "[bi->skb] <-- Ext Rx Write-Back format\n");
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   352
		for (i = 0; i < rx_ring->count; i++) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   353
			buffer_info = &rx_ring->buffer_info[i];
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   354
			rx_desc_ps = E1000_RX_DESC_PS(*rx_ring, i);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   355
			u1 = (struct my_u1 *)rx_desc_ps;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   356
			staterr =
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   357
				le32_to_cpu(rx_desc_ps->wb.middle.status_error);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   358
			if (staterr & E1000_RXD_STAT_DD) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   359
				/* Descriptor Done */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   360
				printk(KERN_INFO "RWB[0x%03X]     %016llX "
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   361
					"%016llX %016llX %016llX "
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   362
					"---------------- %p", i,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   363
					(unsigned long long)le64_to_cpu(u1->a),
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   364
					(unsigned long long)le64_to_cpu(u1->b),
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   365
					(unsigned long long)le64_to_cpu(u1->c),
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   366
					(unsigned long long)le64_to_cpu(u1->d),
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   367
					buffer_info->skb);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   368
			} else {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   369
				printk(KERN_INFO "R  [0x%03X]     %016llX "
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   370
					"%016llX %016llX %016llX %016llX %p", i,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   371
					(unsigned long long)le64_to_cpu(u1->a),
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   372
					(unsigned long long)le64_to_cpu(u1->b),
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   373
					(unsigned long long)le64_to_cpu(u1->c),
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   374
					(unsigned long long)le64_to_cpu(u1->d),
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   375
					(unsigned long long)buffer_info->dma,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   376
					buffer_info->skb);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   377
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   378
				if (netif_msg_pktdata(adapter))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   379
					print_hex_dump(KERN_INFO, "",
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   380
						DUMP_PREFIX_ADDRESS, 16, 1,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   381
						phys_to_virt(buffer_info->dma),
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   382
						adapter->rx_ps_bsize0, true);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   383
			}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   384
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   385
			if (i == rx_ring->next_to_use)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   386
				printk(KERN_CONT " NTU\n");
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   387
			else if (i == rx_ring->next_to_clean)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   388
				printk(KERN_CONT " NTC\n");
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   389
			else
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   390
				printk(KERN_CONT "\n");
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   391
		}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   392
		break;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   393
	default:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   394
	case 0:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   395
		/* Legacy Receive Descriptor Format
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   396
		 *
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   397
		 * +-----------------------------------------------------+
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   398
		 * |                Buffer Address [63:0]                |
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   399
		 * +-----------------------------------------------------+
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   400
		 * | VLAN Tag | Errors | Status 0 | Packet csum | Length |
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   401
		 * +-----------------------------------------------------+
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   402
		 * 63       48 47    40 39      32 31         16 15      0
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   403
		 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   404
		printk(KERN_INFO "Rl[desc]     [address 63:0  ] "
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   405
			"[vl er S cks ln] [bi->dma       ] [bi->skb] "
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   406
			"<-- Legacy format\n");
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   407
		for (i = 0; rx_ring->desc && (i < rx_ring->count); i++) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   408
			rx_desc = E1000_RX_DESC(*rx_ring, i);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   409
			buffer_info = &rx_ring->buffer_info[i];
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   410
			u0 = (struct my_u0 *)rx_desc;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   411
			printk(KERN_INFO "Rl[0x%03X]    %016llX %016llX "
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   412
				"%016llX %p", i,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   413
				(unsigned long long)le64_to_cpu(u0->a),
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   414
				(unsigned long long)le64_to_cpu(u0->b),
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   415
				(unsigned long long)buffer_info->dma,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   416
				buffer_info->skb);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   417
			if (i == rx_ring->next_to_use)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   418
				printk(KERN_CONT " NTU\n");
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   419
			else if (i == rx_ring->next_to_clean)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   420
				printk(KERN_CONT " NTC\n");
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   421
			else
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   422
				printk(KERN_CONT "\n");
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   423
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   424
			if (netif_msg_pktdata(adapter))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   425
				print_hex_dump(KERN_INFO, "",
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   426
					DUMP_PREFIX_ADDRESS,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   427
					16, 1, phys_to_virt(buffer_info->dma),
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   428
					adapter->rx_buffer_len, true);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   429
		}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   430
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   431
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   432
exit:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   433
	return;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   434
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   435
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   436
/**
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   437
 * e1000_desc_unused - calculate if we have unused descriptors
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   438
 **/
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   439
static int e1000_desc_unused(struct e1000_ring *ring)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   440
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   441
	if (ring->next_to_clean > ring->next_to_use)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   442
		return ring->next_to_clean - ring->next_to_use - 1;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   443
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   444
	return ring->count + ring->next_to_clean - ring->next_to_use - 1;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   445
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   446
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   447
/**
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   448
 * e1000_receive_skb - helper function to handle Rx indications
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   449
 * @adapter: board private structure
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   450
 * @status: descriptor status field as written by hardware
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   451
 * @vlan: descriptor vlan field as written by hardware (no le/be conversion)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   452
 * @skb: pointer to sk_buff to be indicated to stack
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   453
 **/
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   454
static void e1000_receive_skb(struct e1000_adapter *adapter,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   455
			      struct net_device *netdev,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   456
			      struct sk_buff *skb,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   457
			      u8 status, __le16 vlan)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   458
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   459
	skb->protocol = eth_type_trans(skb, netdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   460
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   461
	if (adapter->vlgrp && (status & E1000_RXD_STAT_VP))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   462
		vlan_gro_receive(&adapter->napi, adapter->vlgrp,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   463
				 le16_to_cpu(vlan), skb);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   464
	else
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   465
		napi_gro_receive(&adapter->napi, skb);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   466
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   467
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   468
/**
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   469
 * e1000_rx_checksum - Receive Checksum Offload for 82543
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   470
 * @adapter:     board private structure
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   471
 * @status_err:  receive descriptor status and error fields
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   472
 * @csum:	receive descriptor csum field
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   473
 * @sk_buff:     socket buffer with received data
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   474
 **/
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   475
static void e1000_rx_checksum(struct e1000_adapter *adapter, u32 status_err,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   476
			      u32 csum, struct sk_buff *skb)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   477
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   478
	u16 status = (u16)status_err;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   479
	u8 errors = (u8)(status_err >> 24);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   480
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   481
	skb_checksum_none_assert(skb);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   482
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   483
	/* Ignore Checksum bit is set */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   484
	if (status & E1000_RXD_STAT_IXSM)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   485
		return;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   486
	/* TCP/UDP checksum error bit is set */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   487
	if (errors & E1000_RXD_ERR_TCPE) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   488
		/* let the stack verify checksum errors */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   489
		adapter->hw_csum_err++;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   490
		return;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   491
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   492
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   493
	/* TCP/UDP Checksum has not been calculated */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   494
	if (!(status & (E1000_RXD_STAT_TCPCS | E1000_RXD_STAT_UDPCS)))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   495
		return;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   496
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   497
	/* It must be a TCP or UDP packet with a valid checksum */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   498
	if (status & E1000_RXD_STAT_TCPCS) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   499
		/* TCP checksum is good */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   500
		skb->ip_summed = CHECKSUM_UNNECESSARY;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   501
	} else {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   502
		/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   503
		 * IP fragment with UDP payload
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   504
		 * Hardware complements the payload checksum, so we undo it
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   505
		 * and then put the value in host order for further stack use.
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   506
		 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   507
		__sum16 sum = (__force __sum16)htons(csum);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   508
		skb->csum = csum_unfold(~sum);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   509
		skb->ip_summed = CHECKSUM_COMPLETE;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   510
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   511
	adapter->hw_csum_good++;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   512
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   513
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   514
/**
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   515
 * e1000_alloc_rx_buffers - Replace used receive buffers; legacy & extended
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   516
 * @adapter: address of board private structure
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   517
 **/
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   518
static void e1000_alloc_rx_buffers(struct e1000_adapter *adapter,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   519
				   int cleaned_count)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   520
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   521
	struct net_device *netdev = adapter->netdev;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   522
	struct pci_dev *pdev = adapter->pdev;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   523
	struct e1000_ring *rx_ring = adapter->rx_ring;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   524
	struct e1000_rx_desc *rx_desc;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   525
	struct e1000_buffer *buffer_info;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   526
	struct sk_buff *skb;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   527
	unsigned int i;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   528
	unsigned int bufsz = adapter->rx_buffer_len;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   529
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   530
	i = rx_ring->next_to_use;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   531
	buffer_info = &rx_ring->buffer_info[i];
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   532
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   533
	while (cleaned_count--) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   534
		skb = buffer_info->skb;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   535
		if (skb) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   536
			skb_trim(skb, 0);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   537
			goto map_skb;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   538
		}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   539
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   540
		skb = netdev_alloc_skb_ip_align(netdev, bufsz);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   541
		if (!skb) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   542
			/* Better luck next round */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   543
			adapter->alloc_rx_buff_failed++;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   544
			break;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   545
		}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   546
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   547
		buffer_info->skb = skb;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   548
map_skb:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   549
		buffer_info->dma = dma_map_single(&pdev->dev, skb->data,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   550
						  adapter->rx_buffer_len,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   551
						  DMA_FROM_DEVICE);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   552
		if (dma_mapping_error(&pdev->dev, buffer_info->dma)) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   553
			dev_err(&pdev->dev, "RX DMA map failed\n");
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   554
			adapter->rx_dma_failed++;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   555
			break;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   556
		}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   557
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   558
		rx_desc = E1000_RX_DESC(*rx_ring, i);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   559
		rx_desc->buffer_addr = cpu_to_le64(buffer_info->dma);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   560
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   561
		if (unlikely(!(i & (E1000_RX_BUFFER_WRITE - 1)))) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   562
			/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   563
			 * Force memory writes to complete before letting h/w
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   564
			 * know there are new descriptors to fetch.  (Only
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   565
			 * applicable for weak-ordered memory model archs,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   566
			 * such as IA-64).
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   567
			 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   568
			wmb();
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   569
			writel(i, adapter->hw.hw_addr + rx_ring->tail);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   570
		}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   571
		i++;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   572
		if (i == rx_ring->count)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   573
			i = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   574
		buffer_info = &rx_ring->buffer_info[i];
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   575
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   576
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   577
	rx_ring->next_to_use = i;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   578
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   579
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   580
/**
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   581
 * e1000_alloc_rx_buffers_ps - Replace used receive buffers; packet split
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   582
 * @adapter: address of board private structure
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   583
 **/
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   584
static void e1000_alloc_rx_buffers_ps(struct e1000_adapter *adapter,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   585
				      int cleaned_count)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   586
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   587
	struct net_device *netdev = adapter->netdev;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   588
	struct pci_dev *pdev = adapter->pdev;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   589
	union e1000_rx_desc_packet_split *rx_desc;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   590
	struct e1000_ring *rx_ring = adapter->rx_ring;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   591
	struct e1000_buffer *buffer_info;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   592
	struct e1000_ps_page *ps_page;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   593
	struct sk_buff *skb;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   594
	unsigned int i, j;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   595
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   596
	i = rx_ring->next_to_use;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   597
	buffer_info = &rx_ring->buffer_info[i];
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   598
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   599
	while (cleaned_count--) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   600
		rx_desc = E1000_RX_DESC_PS(*rx_ring, i);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   601
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   602
		for (j = 0; j < PS_PAGE_BUFFERS; j++) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   603
			ps_page = &buffer_info->ps_pages[j];
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   604
			if (j >= adapter->rx_ps_pages) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   605
				/* all unused desc entries get hw null ptr */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   606
				rx_desc->read.buffer_addr[j+1] = ~cpu_to_le64(0);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   607
				continue;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   608
			}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   609
			if (!ps_page->page) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   610
				ps_page->page = netdev_alloc_page(netdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   611
				if (!ps_page->page) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   612
					adapter->alloc_rx_buff_failed++;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   613
					goto no_buffers;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   614
				}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   615
				ps_page->dma = dma_map_page(&pdev->dev,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   616
							    ps_page->page,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   617
							    0, PAGE_SIZE,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   618
							    DMA_FROM_DEVICE);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   619
				if (dma_mapping_error(&pdev->dev,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   620
						      ps_page->dma)) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   621
					dev_err(&adapter->pdev->dev,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   622
					  "RX DMA page map failed\n");
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   623
					adapter->rx_dma_failed++;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   624
					goto no_buffers;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   625
				}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   626
			}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   627
			/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   628
			 * Refresh the desc even if buffer_addrs
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   629
			 * didn't change because each write-back
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   630
			 * erases this info.
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   631
			 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   632
			rx_desc->read.buffer_addr[j+1] =
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   633
			     cpu_to_le64(ps_page->dma);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   634
		}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   635
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   636
		skb = netdev_alloc_skb_ip_align(netdev,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   637
						adapter->rx_ps_bsize0);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   638
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   639
		if (!skb) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   640
			adapter->alloc_rx_buff_failed++;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   641
			break;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   642
		}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   643
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   644
		buffer_info->skb = skb;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   645
		buffer_info->dma = dma_map_single(&pdev->dev, skb->data,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   646
						  adapter->rx_ps_bsize0,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   647
						  DMA_FROM_DEVICE);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   648
		if (dma_mapping_error(&pdev->dev, buffer_info->dma)) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   649
			dev_err(&pdev->dev, "RX DMA map failed\n");
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   650
			adapter->rx_dma_failed++;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   651
			/* cleanup skb */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   652
			dev_kfree_skb_any(skb);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   653
			buffer_info->skb = NULL;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   654
			break;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   655
		}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   656
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   657
		rx_desc->read.buffer_addr[0] = cpu_to_le64(buffer_info->dma);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   658
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   659
		if (unlikely(!(i & (E1000_RX_BUFFER_WRITE - 1)))) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   660
			/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   661
			 * Force memory writes to complete before letting h/w
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   662
			 * know there are new descriptors to fetch.  (Only
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   663
			 * applicable for weak-ordered memory model archs,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   664
			 * such as IA-64).
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   665
			 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   666
			wmb();
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   667
			writel(i<<1, adapter->hw.hw_addr + rx_ring->tail);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   668
		}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   669
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   670
		i++;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   671
		if (i == rx_ring->count)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   672
			i = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   673
		buffer_info = &rx_ring->buffer_info[i];
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   674
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   675
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   676
no_buffers:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   677
	rx_ring->next_to_use = i;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   678
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   679
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   680
/**
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   681
 * e1000_alloc_jumbo_rx_buffers - Replace used jumbo receive buffers
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   682
 * @adapter: address of board private structure
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   683
 * @cleaned_count: number of buffers to allocate this pass
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   684
 **/
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   685
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   686
static void e1000_alloc_jumbo_rx_buffers(struct e1000_adapter *adapter,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   687
                                         int cleaned_count)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   688
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   689
	struct net_device *netdev = adapter->netdev;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   690
	struct pci_dev *pdev = adapter->pdev;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   691
	struct e1000_rx_desc *rx_desc;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   692
	struct e1000_ring *rx_ring = adapter->rx_ring;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   693
	struct e1000_buffer *buffer_info;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   694
	struct sk_buff *skb;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   695
	unsigned int i;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   696
	unsigned int bufsz = 256 - 16 /* for skb_reserve */;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   697
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   698
	i = rx_ring->next_to_use;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   699
	buffer_info = &rx_ring->buffer_info[i];
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   700
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   701
	while (cleaned_count--) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   702
		skb = buffer_info->skb;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   703
		if (skb) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   704
			skb_trim(skb, 0);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   705
			goto check_page;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   706
		}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   707
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   708
		skb = netdev_alloc_skb_ip_align(netdev, bufsz);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   709
		if (unlikely(!skb)) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   710
			/* Better luck next round */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   711
			adapter->alloc_rx_buff_failed++;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   712
			break;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   713
		}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   714
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   715
		buffer_info->skb = skb;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   716
check_page:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   717
		/* allocate a new page if necessary */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   718
		if (!buffer_info->page) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   719
			buffer_info->page = alloc_page(GFP_ATOMIC);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   720
			if (unlikely(!buffer_info->page)) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   721
				adapter->alloc_rx_buff_failed++;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   722
				break;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   723
			}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   724
		}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   725
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   726
		if (!buffer_info->dma)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   727
			buffer_info->dma = dma_map_page(&pdev->dev,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   728
			                                buffer_info->page, 0,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   729
			                                PAGE_SIZE,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   730
							DMA_FROM_DEVICE);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   731
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   732
		rx_desc = E1000_RX_DESC(*rx_ring, i);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   733
		rx_desc->buffer_addr = cpu_to_le64(buffer_info->dma);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   734
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   735
		if (unlikely(++i == rx_ring->count))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   736
			i = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   737
		buffer_info = &rx_ring->buffer_info[i];
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   738
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   739
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   740
	if (likely(rx_ring->next_to_use != i)) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   741
		rx_ring->next_to_use = i;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   742
		if (unlikely(i-- == 0))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   743
			i = (rx_ring->count - 1);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   744
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   745
		/* Force memory writes to complete before letting h/w
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   746
		 * know there are new descriptors to fetch.  (Only
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   747
		 * applicable for weak-ordered memory model archs,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   748
		 * such as IA-64). */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   749
		wmb();
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   750
		writel(i, adapter->hw.hw_addr + rx_ring->tail);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   751
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   752
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   753
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   754
/**
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   755
 * e1000_clean_rx_irq - Send received data up the network stack; legacy
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   756
 * @adapter: board private structure
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   757
 *
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   758
 * the return value indicates whether actual cleaning was done, there
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   759
 * is no guarantee that everything was cleaned
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   760
 **/
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   761
static bool e1000_clean_rx_irq(struct e1000_adapter *adapter,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   762
			       int *work_done, int work_to_do)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   763
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   764
	struct net_device *netdev = adapter->netdev;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   765
	struct pci_dev *pdev = adapter->pdev;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   766
	struct e1000_hw *hw = &adapter->hw;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   767
	struct e1000_ring *rx_ring = adapter->rx_ring;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   768
	struct e1000_rx_desc *rx_desc, *next_rxd;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   769
	struct e1000_buffer *buffer_info, *next_buffer;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   770
	u32 length;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   771
	unsigned int i;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   772
	int cleaned_count = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   773
	bool cleaned = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   774
	unsigned int total_rx_bytes = 0, total_rx_packets = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   775
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   776
	i = rx_ring->next_to_clean;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   777
	rx_desc = E1000_RX_DESC(*rx_ring, i);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   778
	buffer_info = &rx_ring->buffer_info[i];
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   779
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   780
	while (rx_desc->status & E1000_RXD_STAT_DD) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   781
		struct sk_buff *skb;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   782
		u8 status;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   783
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   784
		if (*work_done >= work_to_do)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   785
			break;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   786
		(*work_done)++;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   787
		rmb();	/* read descriptor and rx_buffer_info after status DD */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   788
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   789
		status = rx_desc->status;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   790
		skb = buffer_info->skb;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   791
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   792
		if (!adapter->ecdev)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   793
			buffer_info->skb = NULL;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   794
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   795
		prefetch(skb->data - NET_IP_ALIGN);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   796
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   797
		i++;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   798
		if (i == rx_ring->count)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   799
			i = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   800
		next_rxd = E1000_RX_DESC(*rx_ring, i);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   801
		prefetch(next_rxd);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   802
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   803
		next_buffer = &rx_ring->buffer_info[i];
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   804
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   805
		cleaned = 1;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   806
		cleaned_count++;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   807
		dma_unmap_single(&pdev->dev,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   808
				 buffer_info->dma,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   809
				 adapter->rx_buffer_len,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   810
				 DMA_FROM_DEVICE);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   811
		buffer_info->dma = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   812
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   813
		length = le16_to_cpu(rx_desc->length);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   814
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   815
		/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   816
		 * !EOP means multiple descriptors were used to store a single
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   817
		 * packet, if that's the case we need to toss it.  In fact, we
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   818
		 * need to toss every packet with the EOP bit clear and the
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   819
		 * next frame that _does_ have the EOP bit set, as it is by
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   820
		 * definition only a frame fragment
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   821
		 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   822
		if (unlikely(!(status & E1000_RXD_STAT_EOP)))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   823
			adapter->flags2 |= FLAG2_IS_DISCARDING;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   824
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   825
		if (adapter->flags2 & FLAG2_IS_DISCARDING) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   826
			/* All receives must fit into a single buffer */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   827
			e_dbg("Receive packet consumed multiple buffers\n");
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   828
			/* recycle */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   829
			buffer_info->skb = skb;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   830
			if (status & E1000_RXD_STAT_EOP)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   831
				adapter->flags2 &= ~FLAG2_IS_DISCARDING;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   832
			goto next_desc;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   833
		}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   834
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   835
		if (!adapter->ecdev && (rx_desc->errors & E1000_RXD_ERR_FRAME_ERR_MASK)) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   836
			/* recycle */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   837
			buffer_info->skb = skb;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   838
			goto next_desc;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   839
		}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   840
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   841
		/* adjust length to remove Ethernet CRC */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   842
		if (!(adapter->flags2 & FLAG2_CRC_STRIPPING))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   843
			length -= 4;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   844
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   845
		total_rx_bytes += length;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   846
		total_rx_packets++;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   847
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   848
		/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   849
		 * code added for copybreak, this should improve
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   850
		 * performance for small packets with large amounts
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   851
		 * of reassembly being done in the stack
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   852
		 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   853
		if (!adapter->ecdev && length < copybreak) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   854
			struct sk_buff *new_skb =
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   855
			    netdev_alloc_skb_ip_align(netdev, length);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   856
			if (new_skb) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   857
				skb_copy_to_linear_data_offset(new_skb,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   858
							       -NET_IP_ALIGN,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   859
							       (skb->data -
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   860
								NET_IP_ALIGN),
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   861
							       (length +
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   862
								NET_IP_ALIGN));
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   863
				/* save the skb in buffer_info as good */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   864
				buffer_info->skb = skb;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   865
				skb = new_skb;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   866
			}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   867
			/* else just continue with the old one */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   868
		}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   869
		/* end copybreak code */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   870
		skb_put(skb, length);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   871
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   872
		/* Receive Checksum Offload */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   873
		e1000_rx_checksum(adapter,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   874
				  (u32)(status) |
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   875
				  ((u32)(rx_desc->errors) << 24),
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   876
				  le16_to_cpu(rx_desc->csum), skb);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   877
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   878
		if (adapter->ecdev) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   879
			ecdev_receive(adapter->ecdev, skb->data, length);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   880
			adapter->ec_watchdog_jiffies = jiffies;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   881
		} else {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   882
			e1000_receive_skb(adapter, netdev, skb,status,rx_desc->special);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   883
		}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   884
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   885
next_desc:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   886
		rx_desc->status = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   887
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   888
		/* return some buffers to hardware, one at a time is too slow */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   889
		if (cleaned_count >= E1000_RX_BUFFER_WRITE) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   890
			adapter->alloc_rx_buf(adapter, cleaned_count);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   891
			cleaned_count = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   892
		}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   893
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   894
		/* use prefetched values */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   895
		rx_desc = next_rxd;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   896
		buffer_info = next_buffer;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   897
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   898
	rx_ring->next_to_clean = i;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   899
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   900
	cleaned_count = e1000_desc_unused(rx_ring);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   901
	if (cleaned_count)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   902
		adapter->alloc_rx_buf(adapter, cleaned_count);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   903
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   904
	adapter->total_rx_bytes += total_rx_bytes;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   905
	adapter->total_rx_packets += total_rx_packets;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   906
	netdev->stats.rx_bytes += total_rx_bytes;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   907
	netdev->stats.rx_packets += total_rx_packets;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   908
	return cleaned;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   909
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   910
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   911
static void e1000_put_txbuf(struct e1000_adapter *adapter,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   912
			     struct e1000_buffer *buffer_info)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   913
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   914
	if (adapter->ecdev)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   915
		return;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   916
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   917
	if (buffer_info->dma) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   918
		if (buffer_info->mapped_as_page)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   919
			dma_unmap_page(&adapter->pdev->dev, buffer_info->dma,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   920
				       buffer_info->length, DMA_TO_DEVICE);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   921
		else
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   922
			dma_unmap_single(&adapter->pdev->dev, buffer_info->dma,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   923
					 buffer_info->length, DMA_TO_DEVICE);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   924
		buffer_info->dma = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   925
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   926
	if (buffer_info->skb) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   927
		dev_kfree_skb_any(buffer_info->skb);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   928
		buffer_info->skb = NULL;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   929
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   930
	buffer_info->time_stamp = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   931
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   932
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   933
static void e1000_print_hw_hang(struct work_struct *work)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   934
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   935
	struct e1000_adapter *adapter = container_of(work,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   936
	                                             struct e1000_adapter,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   937
	                                             print_hang_task);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   938
	struct e1000_ring *tx_ring = adapter->tx_ring;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   939
	unsigned int i = tx_ring->next_to_clean;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   940
	unsigned int eop = tx_ring->buffer_info[i].next_to_watch;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   941
	struct e1000_tx_desc *eop_desc = E1000_TX_DESC(*tx_ring, eop);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   942
	struct e1000_hw *hw = &adapter->hw;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   943
	u16 phy_status, phy_1000t_status, phy_ext_status;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   944
	u16 pci_status;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   945
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   946
	e1e_rphy(hw, PHY_STATUS, &phy_status);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   947
	e1e_rphy(hw, PHY_1000T_STATUS, &phy_1000t_status);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   948
	e1e_rphy(hw, PHY_EXT_STATUS, &phy_ext_status);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   949
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   950
	pci_read_config_word(adapter->pdev, PCI_STATUS, &pci_status);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   951
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   952
	/* detected Hardware unit hang */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   953
	e_err("Detected Hardware Unit Hang:\n"
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   954
	      "  TDH                  <%x>\n"
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   955
	      "  TDT                  <%x>\n"
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   956
	      "  next_to_use          <%x>\n"
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   957
	      "  next_to_clean        <%x>\n"
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   958
	      "buffer_info[next_to_clean]:\n"
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   959
	      "  time_stamp           <%lx>\n"
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   960
	      "  next_to_watch        <%x>\n"
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   961
	      "  jiffies              <%lx>\n"
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   962
	      "  next_to_watch.status <%x>\n"
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   963
	      "MAC Status             <%x>\n"
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   964
	      "PHY Status             <%x>\n"
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   965
	      "PHY 1000BASE-T Status  <%x>\n"
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   966
	      "PHY Extended Status    <%x>\n"
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   967
	      "PCI Status             <%x>\n",
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   968
	      readl(adapter->hw.hw_addr + tx_ring->head),
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   969
	      readl(adapter->hw.hw_addr + tx_ring->tail),
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   970
	      tx_ring->next_to_use,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   971
	      tx_ring->next_to_clean,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   972
	      tx_ring->buffer_info[eop].time_stamp,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   973
	      eop,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   974
	      jiffies,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   975
	      eop_desc->upper.fields.status,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   976
	      er32(STATUS),
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   977
	      phy_status,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   978
	      phy_1000t_status,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   979
	      phy_ext_status,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   980
	      pci_status);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   981
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   982
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   983
/**
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   984
 * e1000_clean_tx_irq - Reclaim resources after transmit completes
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   985
 * @adapter: board private structure
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   986
 *
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   987
 * the return value indicates whether actual cleaning was done, there
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   988
 * is no guarantee that everything was cleaned
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   989
 **/
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   990
static bool e1000_clean_tx_irq(struct e1000_adapter *adapter)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   991
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   992
	struct net_device *netdev = adapter->netdev;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   993
	struct e1000_hw *hw = &adapter->hw;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   994
	struct e1000_ring *tx_ring = adapter->tx_ring;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   995
	struct e1000_tx_desc *tx_desc, *eop_desc;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   996
	struct e1000_buffer *buffer_info;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   997
	unsigned int i, eop;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   998
	unsigned int count = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   999
	unsigned int total_tx_bytes = 0, total_tx_packets = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1000
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1001
	i = tx_ring->next_to_clean;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1002
	eop = tx_ring->buffer_info[i].next_to_watch;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1003
	eop_desc = E1000_TX_DESC(*tx_ring, eop);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1004
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1005
	while ((eop_desc->upper.data & cpu_to_le32(E1000_TXD_STAT_DD)) &&
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1006
	       (count < tx_ring->count)) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1007
		bool cleaned = false;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1008
		rmb(); /* read buffer_info after eop_desc */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1009
		for (; !cleaned; count++) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1010
			tx_desc = E1000_TX_DESC(*tx_ring, i);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1011
			buffer_info = &tx_ring->buffer_info[i];
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1012
			cleaned = (i == eop);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1013
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1014
			if (cleaned) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1015
				total_tx_packets += buffer_info->segs;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1016
				total_tx_bytes += buffer_info->bytecount;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1017
			}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1018
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1019
			e1000_put_txbuf(adapter, buffer_info);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1020
			tx_desc->upper.data = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1021
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1022
			i++;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1023
			if (i == tx_ring->count)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1024
				i = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1025
		}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1026
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1027
		if (i == tx_ring->next_to_use)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1028
			break;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1029
		eop = tx_ring->buffer_info[i].next_to_watch;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1030
		eop_desc = E1000_TX_DESC(*tx_ring, eop);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1031
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1032
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1033
	tx_ring->next_to_clean = i;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1034
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1035
#define TX_WAKE_THRESHOLD 32
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1036
	if (!adapter->ecdev && count && netif_carrier_ok(netdev) &&
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1037
	    e1000_desc_unused(tx_ring) >= TX_WAKE_THRESHOLD) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1038
		/* Make sure that anybody stopping the queue after this
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1039
		 * sees the new next_to_clean.
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1040
		 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1041
		smp_mb();
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1042
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1043
		if (netif_queue_stopped(netdev) &&
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1044
		    !(test_bit(__E1000_DOWN, &adapter->state))) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1045
			netif_wake_queue(netdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1046
			++adapter->restart_queue;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1047
		}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1048
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1049
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1050
	if (!adapter->ecdev && adapter->detect_tx_hung) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1051
		/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1052
		 * Detect a transmit hang in hardware, this serializes the
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1053
		 * check with the clearing of time_stamp and movement of i
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1054
		 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1055
		adapter->detect_tx_hung = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1056
		if (tx_ring->buffer_info[i].time_stamp &&
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1057
		    time_after(jiffies, tx_ring->buffer_info[i].time_stamp
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1058
			       + (adapter->tx_timeout_factor * HZ)) &&
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1059
		    !(er32(STATUS) & E1000_STATUS_TXOFF)) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1060
			schedule_work(&adapter->print_hang_task);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1061
			netif_stop_queue(netdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1062
		}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1063
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1064
	adapter->total_tx_bytes += total_tx_bytes;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1065
	adapter->total_tx_packets += total_tx_packets;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1066
	netdev->stats.tx_bytes += total_tx_bytes;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1067
	netdev->stats.tx_packets += total_tx_packets;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1068
	return count < tx_ring->count;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1069
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1070
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1071
/**
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1072
 * e1000_clean_rx_irq_ps - Send received data up the network stack; packet split
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1073
 * @adapter: board private structure
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1074
 *
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1075
 * the return value indicates whether actual cleaning was done, there
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1076
 * is no guarantee that everything was cleaned
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1077
 **/
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1078
static bool e1000_clean_rx_irq_ps(struct e1000_adapter *adapter,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1079
				  int *work_done, int work_to_do)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1080
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1081
	struct e1000_hw *hw = &adapter->hw;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1082
	union e1000_rx_desc_packet_split *rx_desc, *next_rxd;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1083
	struct net_device *netdev = adapter->netdev;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1084
	struct pci_dev *pdev = adapter->pdev;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1085
	struct e1000_ring *rx_ring = adapter->rx_ring;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1086
	struct e1000_buffer *buffer_info, *next_buffer;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1087
	struct e1000_ps_page *ps_page;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1088
	struct sk_buff *skb;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1089
	unsigned int i, j;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1090
	u32 length, staterr;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1091
	int cleaned_count = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1092
	bool cleaned = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1093
	unsigned int total_rx_bytes = 0, total_rx_packets = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1094
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1095
	i = rx_ring->next_to_clean;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1096
	rx_desc = E1000_RX_DESC_PS(*rx_ring, i);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1097
	staterr = le32_to_cpu(rx_desc->wb.middle.status_error);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1098
	buffer_info = &rx_ring->buffer_info[i];
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1099
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1100
	while (staterr & E1000_RXD_STAT_DD) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1101
		if (*work_done >= work_to_do)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1102
			break;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1103
		(*work_done)++;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1104
		skb = buffer_info->skb;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1105
		rmb();	/* read descriptor and rx_buffer_info after status DD */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1106
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1107
		/* in the packet split case this is header only */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1108
		prefetch(skb->data - NET_IP_ALIGN);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1109
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1110
		i++;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1111
		if (i == rx_ring->count)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1112
			i = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1113
		next_rxd = E1000_RX_DESC_PS(*rx_ring, i);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1114
		prefetch(next_rxd);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1115
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1116
		next_buffer = &rx_ring->buffer_info[i];
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1117
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1118
		cleaned = 1;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1119
		cleaned_count++;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1120
		dma_unmap_single(&pdev->dev, buffer_info->dma,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1121
				 adapter->rx_ps_bsize0,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1122
				 DMA_FROM_DEVICE);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1123
		buffer_info->dma = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1124
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1125
		/* see !EOP comment in other rx routine */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1126
		if (!(staterr & E1000_RXD_STAT_EOP))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1127
			adapter->flags2 |= FLAG2_IS_DISCARDING;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1128
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1129
		if (adapter->flags2 & FLAG2_IS_DISCARDING) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1130
			e_dbg("Packet Split buffers didn't pick up the full "
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1131
			      "packet\n");
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1132
			if (!adapter->ecdev) dev_kfree_skb_irq(skb);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1133
			if (staterr & E1000_RXD_STAT_EOP)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1134
				adapter->flags2 &= ~FLAG2_IS_DISCARDING;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1135
			goto next_desc;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1136
		}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1137
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1138
		if (staterr & E1000_RXDEXT_ERR_FRAME_ERR_MASK) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1139
			if (!adapter->ecdev)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1140
				dev_kfree_skb_irq(skb);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1141
			goto next_desc;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1142
		}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1143
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1144
		length = le16_to_cpu(rx_desc->wb.middle.length0);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1145
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1146
		if (!length) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1147
			e_dbg("Last part of the packet spanning multiple "
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1148
			      "descriptors\n");
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1149
			if (!adapter->ecdev)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1150
				dev_kfree_skb_irq(skb);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1151
			goto next_desc;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1152
		}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1153
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1154
		/* Good Receive */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1155
		skb_put(skb, length);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1156
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1157
		{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1158
		/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1159
		 * this looks ugly, but it seems compiler issues make it
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1160
		 * more efficient than reusing j
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1161
		 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1162
		int l1 = le16_to_cpu(rx_desc->wb.upper.length[0]);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1163
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1164
		/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1165
		 * page alloc/put takes too long and effects small packet
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1166
		 * throughput, so unsplit small packets and save the alloc/put
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1167
		 * only valid in softirq (napi) context to call kmap_*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1168
		 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1169
		if (l1 && (l1 <= copybreak) &&
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1170
		    ((length + l1) <= adapter->rx_ps_bsize0)) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1171
			u8 *vaddr;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1172
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1173
			ps_page = &buffer_info->ps_pages[0];
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1174
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1175
			/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1176
			 * there is no documentation about how to call
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1177
			 * kmap_atomic, so we can't hold the mapping
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1178
			 * very long
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1179
			 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1180
			dma_sync_single_for_cpu(&pdev->dev, ps_page->dma,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1181
						PAGE_SIZE, DMA_FROM_DEVICE);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1182
			vaddr = kmap_atomic(ps_page->page, KM_SKB_DATA_SOFTIRQ);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1183
			memcpy(skb_tail_pointer(skb), vaddr, l1);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1184
			kunmap_atomic(vaddr, KM_SKB_DATA_SOFTIRQ);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1185
			dma_sync_single_for_device(&pdev->dev, ps_page->dma,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1186
						   PAGE_SIZE, DMA_FROM_DEVICE);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1187
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1188
			/* remove the CRC */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1189
			if (!(adapter->flags2 & FLAG2_CRC_STRIPPING))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1190
				l1 -= 4;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1191
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1192
			skb_put(skb, l1);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1193
			goto copydone;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1194
		} /* if */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1195
		}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1196
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1197
		for (j = 0; j < PS_PAGE_BUFFERS; j++) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1198
			length = le16_to_cpu(rx_desc->wb.upper.length[j]);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1199
			if (!length)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1200
				break;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1201
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1202
			ps_page = &buffer_info->ps_pages[j];
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1203
			dma_unmap_page(&pdev->dev, ps_page->dma, PAGE_SIZE,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1204
				       DMA_FROM_DEVICE);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1205
			ps_page->dma = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1206
			skb_add_rx_frag(skb, j, ps_page->page, 0, length);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1207
			ps_page->page = NULL;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1208
		}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1209
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1210
		/* strip the ethernet crc, problem is we're using pages now so
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1211
		 * this whole operation can get a little cpu intensive
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1212
		 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1213
		if (!(adapter->flags2 & FLAG2_CRC_STRIPPING))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1214
			pskb_trim(skb, skb->len - 4);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1215
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1216
copydone:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1217
		total_rx_bytes += skb->len;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1218
		total_rx_packets++;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1219
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1220
		e1000_rx_checksum(adapter, staterr, le16_to_cpu(
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1221
			rx_desc->wb.lower.hi_dword.csum_ip.csum), skb);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1222
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1223
		if (rx_desc->wb.upper.header_status &
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1224
			   cpu_to_le16(E1000_RXDPS_HDRSTAT_HDRSP))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1225
			adapter->rx_hdr_split++;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1226
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1227
		if (adapter->ecdev) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1228
			ecdev_receive(adapter->ecdev, skb->data, length);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1229
			adapter->ec_watchdog_jiffies = jiffies;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1230
		} else {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1231
			e1000_receive_skb(adapter, netdev, skb,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1232
					  staterr, rx_desc->wb.middle.vlan);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1233
		}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1234
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1235
next_desc:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1236
		rx_desc->wb.middle.status_error &= cpu_to_le32(~0xFF);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1237
		if (!adapter->ecdev) buffer_info->skb = NULL;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1238
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1239
		/* return some buffers to hardware, one at a time is too slow */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1240
		if (cleaned_count >= E1000_RX_BUFFER_WRITE) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1241
			adapter->alloc_rx_buf(adapter, cleaned_count);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1242
			cleaned_count = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1243
		}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1244
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1245
		/* use prefetched values */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1246
		rx_desc = next_rxd;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1247
		buffer_info = next_buffer;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1248
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1249
		staterr = le32_to_cpu(rx_desc->wb.middle.status_error);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1250
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1251
	rx_ring->next_to_clean = i;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1252
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1253
	cleaned_count = e1000_desc_unused(rx_ring);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1254
	if (cleaned_count)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1255
		adapter->alloc_rx_buf(adapter, cleaned_count);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1256
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1257
	adapter->total_rx_bytes += total_rx_bytes;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1258
	adapter->total_rx_packets += total_rx_packets;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1259
	netdev->stats.rx_bytes += total_rx_bytes;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1260
	netdev->stats.rx_packets += total_rx_packets;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1261
	return cleaned;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1262
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1263
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1264
/**
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1265
 * e1000_consume_page - helper function
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1266
 **/
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1267
static void e1000_consume_page(struct e1000_buffer *bi, struct sk_buff *skb,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1268
                               u16 length)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1269
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1270
	bi->page = NULL;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1271
	skb->len += length;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1272
	skb->data_len += length;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1273
	skb->truesize += length;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1274
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1275
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1276
/**
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1277
 * e1000_clean_jumbo_rx_irq - Send received data up the network stack; legacy
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1278
 * @adapter: board private structure
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1279
 *
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1280
 * the return value indicates whether actual cleaning was done, there
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1281
 * is no guarantee that everything was cleaned
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1282
 **/
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1283
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1284
static bool e1000_clean_jumbo_rx_irq(struct e1000_adapter *adapter,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1285
                                     int *work_done, int work_to_do)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1286
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1287
	struct net_device *netdev = adapter->netdev;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1288
	struct pci_dev *pdev = adapter->pdev;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1289
	struct e1000_ring *rx_ring = adapter->rx_ring;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1290
	struct e1000_rx_desc *rx_desc, *next_rxd;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1291
	struct e1000_buffer *buffer_info, *next_buffer;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1292
	u32 length;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1293
	unsigned int i;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1294
	int cleaned_count = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1295
	bool cleaned = false;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1296
	unsigned int total_rx_bytes=0, total_rx_packets=0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1297
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1298
	i = rx_ring->next_to_clean;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1299
	rx_desc = E1000_RX_DESC(*rx_ring, i);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1300
	buffer_info = &rx_ring->buffer_info[i];
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1301
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1302
	while (rx_desc->status & E1000_RXD_STAT_DD) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1303
		struct sk_buff *skb;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1304
		u8 status;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1305
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1306
		if (*work_done >= work_to_do)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1307
			break;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1308
		(*work_done)++;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1309
		rmb();	/* read descriptor and rx_buffer_info after status DD */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1310
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1311
		status = rx_desc->status;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1312
		skb = buffer_info->skb;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1313
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1314
		if (!adapter->ecdev)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1315
			buffer_info->skb = NULL;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1316
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1317
		++i;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1318
		if (i == rx_ring->count)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1319
			i = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1320
		next_rxd = E1000_RX_DESC(*rx_ring, i);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1321
		prefetch(next_rxd);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1322
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1323
		next_buffer = &rx_ring->buffer_info[i];
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1324
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1325
		cleaned = true;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1326
		cleaned_count++;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1327
		dma_unmap_page(&pdev->dev, buffer_info->dma, PAGE_SIZE,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1328
			       DMA_FROM_DEVICE);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1329
		buffer_info->dma = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1330
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1331
		length = le16_to_cpu(rx_desc->length);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1332
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1333
		/* errors is only valid for DD + EOP descriptors */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1334
		if (!adapter->ecdev && unlikely((status & E1000_RXD_STAT_EOP) &&
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1335
		    (rx_desc->errors & E1000_RXD_ERR_FRAME_ERR_MASK))) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1336
				/* recycle both page and skb */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1337
				buffer_info->skb = skb;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1338
				/* an error means any chain goes out the window
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1339
				 * too */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1340
				if (rx_ring->rx_skb_top)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1341
					dev_kfree_skb(rx_ring->rx_skb_top);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1342
				rx_ring->rx_skb_top = NULL;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1343
				goto next_desc;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1344
		}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1345
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1346
#define rxtop rx_ring->rx_skb_top
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1347
		if (!(status & E1000_RXD_STAT_EOP)) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1348
			/* this descriptor is only the beginning (or middle) */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1349
			if (!rxtop) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1350
				/* this is the beginning of a chain */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1351
				rxtop = skb;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1352
				skb_fill_page_desc(rxtop, 0, buffer_info->page,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1353
				                   0, length);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1354
			} else {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1355
				/* this is the middle of a chain */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1356
				skb_fill_page_desc(rxtop,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1357
				    skb_shinfo(rxtop)->nr_frags,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1358
				    buffer_info->page, 0, length);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1359
				/* re-use the skb, only consumed the page */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1360
				buffer_info->skb = skb;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1361
			}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1362
			e1000_consume_page(buffer_info, rxtop, length);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1363
			goto next_desc;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1364
		} else {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1365
			if (rxtop) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1366
				/* end of the chain */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1367
				skb_fill_page_desc(rxtop,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1368
				    skb_shinfo(rxtop)->nr_frags,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1369
				    buffer_info->page, 0, length);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1370
				/* re-use the current skb, we only consumed the
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1371
				 * page */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1372
				buffer_info->skb = skb;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1373
				skb = rxtop;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1374
				rxtop = NULL;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1375
				e1000_consume_page(buffer_info, skb, length);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1376
			} else {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1377
				/* no chain, got EOP, this buf is the packet
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1378
				 * copybreak to save the put_page/alloc_page */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1379
				if (length <= copybreak &&
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1380
				    skb_tailroom(skb) >= length) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1381
					u8 *vaddr;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1382
					vaddr = kmap_atomic(buffer_info->page,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1383
					                   KM_SKB_DATA_SOFTIRQ);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1384
					memcpy(skb_tail_pointer(skb), vaddr,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1385
					       length);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1386
					kunmap_atomic(vaddr,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1387
					              KM_SKB_DATA_SOFTIRQ);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1388
					/* re-use the page, so don't erase
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1389
					 * buffer_info->page */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1390
					skb_put(skb, length);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1391
				} else {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1392
					skb_fill_page_desc(skb, 0,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1393
					                   buffer_info->page, 0,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1394
				                           length);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1395
					e1000_consume_page(buffer_info, skb,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1396
					                   length);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1397
				}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1398
			}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1399
		}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1400
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1401
		/* Receive Checksum Offload XXX recompute due to CRC strip? */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1402
		e1000_rx_checksum(adapter,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1403
		                  (u32)(status) |
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1404
		                  ((u32)(rx_desc->errors) << 24),
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1405
		                  le16_to_cpu(rx_desc->csum), skb);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1406
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1407
		/* probably a little skewed due to removing CRC */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1408
		total_rx_bytes += skb->len;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1409
		total_rx_packets++;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1410
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1411
		/* eth type trans needs skb->data to point to something */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1412
		if (!adapter->ecdev && !pskb_may_pull(skb, ETH_HLEN)) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1413
			e_err("pskb_may_pull failed.\n");
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1414
			dev_kfree_skb(skb);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1415
			goto next_desc;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1416
		}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1417
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1418
		if (adapter->ecdev) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1419
			ecdev_receive(adapter->ecdev, skb->data, length);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1420
			adapter->ec_watchdog_jiffies = jiffies;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1421
		} else {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1422
			e1000_receive_skb(adapter, netdev, skb, status,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1423
			                  rx_desc->special);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1424
		}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1425
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1426
next_desc:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1427
		rx_desc->status = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1428
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1429
		/* return some buffers to hardware, one at a time is too slow */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1430
		if (unlikely(cleaned_count >= E1000_RX_BUFFER_WRITE)) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1431
			adapter->alloc_rx_buf(adapter, cleaned_count);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1432
			cleaned_count = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1433
		}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1434
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1435
		/* use prefetched values */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1436
		rx_desc = next_rxd;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1437
		buffer_info = next_buffer;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1438
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1439
	rx_ring->next_to_clean = i;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1440
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1441
	cleaned_count = e1000_desc_unused(rx_ring);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1442
	if (cleaned_count)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1443
		adapter->alloc_rx_buf(adapter, cleaned_count);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1444
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1445
	adapter->total_rx_bytes += total_rx_bytes;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1446
	adapter->total_rx_packets += total_rx_packets;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1447
	netdev->stats.rx_bytes += total_rx_bytes;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1448
	netdev->stats.rx_packets += total_rx_packets;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1449
	return cleaned;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1450
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1451
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1452
/**
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1453
 * e1000_clean_rx_ring - Free Rx Buffers per Queue
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1454
 * @adapter: board private structure
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1455
 **/
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1456
static void e1000_clean_rx_ring(struct e1000_adapter *adapter)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1457
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1458
	struct e1000_ring *rx_ring = adapter->rx_ring;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1459
	struct e1000_buffer *buffer_info;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1460
	struct e1000_ps_page *ps_page;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1461
	struct pci_dev *pdev = adapter->pdev;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1462
	unsigned int i, j;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1463
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1464
	/* Free all the Rx ring sk_buffs */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1465
	for (i = 0; i < rx_ring->count; i++) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1466
		buffer_info = &rx_ring->buffer_info[i];
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1467
		if (buffer_info->dma) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1468
			if (adapter->clean_rx == e1000_clean_rx_irq)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1469
				dma_unmap_single(&pdev->dev, buffer_info->dma,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1470
						 adapter->rx_buffer_len,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1471
						 DMA_FROM_DEVICE);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1472
			else if (adapter->clean_rx == e1000_clean_jumbo_rx_irq)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1473
				dma_unmap_page(&pdev->dev, buffer_info->dma,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1474
				               PAGE_SIZE,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1475
					       DMA_FROM_DEVICE);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1476
			else if (adapter->clean_rx == e1000_clean_rx_irq_ps)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1477
				dma_unmap_single(&pdev->dev, buffer_info->dma,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1478
						 adapter->rx_ps_bsize0,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1479
						 DMA_FROM_DEVICE);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1480
			buffer_info->dma = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1481
		}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1482
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1483
		if (buffer_info->page) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1484
			put_page(buffer_info->page);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1485
			buffer_info->page = NULL;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1486
		}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1487
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1488
		if (buffer_info->skb) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1489
			dev_kfree_skb(buffer_info->skb);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1490
			buffer_info->skb = NULL;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1491
		}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1492
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1493
		for (j = 0; j < PS_PAGE_BUFFERS; j++) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1494
			ps_page = &buffer_info->ps_pages[j];
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1495
			if (!ps_page->page)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1496
				break;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1497
			dma_unmap_page(&pdev->dev, ps_page->dma, PAGE_SIZE,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1498
				       DMA_FROM_DEVICE);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1499
			ps_page->dma = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1500
			put_page(ps_page->page);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1501
			ps_page->page = NULL;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1502
		}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1503
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1504
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1505
	/* there also may be some cached data from a chained receive */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1506
	if (rx_ring->rx_skb_top) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1507
		dev_kfree_skb(rx_ring->rx_skb_top);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1508
		rx_ring->rx_skb_top = NULL;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1509
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1510
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1511
	/* Zero out the descriptor ring */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1512
	memset(rx_ring->desc, 0, rx_ring->size);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1513
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1514
	rx_ring->next_to_clean = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1515
	rx_ring->next_to_use = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1516
	adapter->flags2 &= ~FLAG2_IS_DISCARDING;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1517
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1518
	writel(0, adapter->hw.hw_addr + rx_ring->head);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1519
	writel(0, adapter->hw.hw_addr + rx_ring->tail);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1520
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1521
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1522
static void e1000e_downshift_workaround(struct work_struct *work)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1523
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1524
	struct e1000_adapter *adapter = container_of(work,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1525
					struct e1000_adapter, downshift_task);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1526
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1527
	e1000e_gig_downshift_workaround_ich8lan(&adapter->hw);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1528
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1529
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1530
/**
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1531
 * e1000_intr_msi - Interrupt Handler
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1532
 * @irq: interrupt number
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1533
 * @data: pointer to a network interface device structure
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1534
 **/
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1535
static irqreturn_t e1000_intr_msi(int irq, void *data)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1536
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1537
	struct net_device *netdev = data;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1538
	struct e1000_adapter *adapter = netdev_priv(netdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1539
	struct e1000_hw *hw = &adapter->hw;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1540
	u32 icr = er32(ICR);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1541
2473
f62b64fdbc23 Fixed e1000_open() in e1000e drivers.
Florian Pose <fp@igh-essen.com>
parents: 2472
diff changeset
  1542
	if (adapter->ecdev) {
f62b64fdbc23 Fixed e1000_open() in e1000e drivers.
Florian Pose <fp@igh-essen.com>
parents: 2472
diff changeset
  1543
		int ec_work_done = 0;
f62b64fdbc23 Fixed e1000_open() in e1000e drivers.
Florian Pose <fp@igh-essen.com>
parents: 2472
diff changeset
  1544
		adapter->clean_rx(adapter, &ec_work_done, 100);
f62b64fdbc23 Fixed e1000_open() in e1000e drivers.
Florian Pose <fp@igh-essen.com>
parents: 2472
diff changeset
  1545
		e1000_clean_tx_irq(adapter);
2219
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1546
		return IRQ_HANDLED;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1547
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1548
	/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1549
	 * read ICR disables interrupts using IAM
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1550
	 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1551
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1552
	if (icr & E1000_ICR_LSC) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1553
		hw->mac.get_link_status = 1;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1554
		/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1555
		 * ICH8 workaround-- Call gig speed drop workaround on cable
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1556
		 * disconnect (LSC) before accessing any PHY registers
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1557
		 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1558
		if ((adapter->flags & FLAG_LSC_GIG_SPEED_DROP) &&
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1559
		    (!(er32(STATUS) & E1000_STATUS_LU)))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1560
			schedule_work(&adapter->downshift_task);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1561
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1562
		/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1563
		 * 80003ES2LAN workaround-- For packet buffer work-around on
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1564
		 * link down event; disable receives here in the ISR and reset
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1565
		 * adapter in watchdog
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1566
		 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1567
		if (netif_carrier_ok(netdev) &&
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1568
		    adapter->flags & FLAG_RX_NEEDS_RESTART) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1569
			/* disable receives */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1570
			u32 rctl = er32(RCTL);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1571
			ew32(RCTL, rctl & ~E1000_RCTL_EN);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1572
			adapter->flags |= FLAG_RX_RESTART_NOW;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1573
		}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1574
		/* guard against interrupt when we're going down */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1575
		if (!test_bit(__E1000_DOWN, &adapter->state))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1576
			mod_timer(&adapter->watchdog_timer, jiffies + 1);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1577
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1578
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1579
	if (napi_schedule_prep(&adapter->napi)) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1580
		adapter->total_tx_bytes = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1581
		adapter->total_tx_packets = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1582
		adapter->total_rx_bytes = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1583
		adapter->total_rx_packets = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1584
		__napi_schedule(&adapter->napi);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1585
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1586
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1587
	return IRQ_HANDLED;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1588
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1589
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1590
/**
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1591
 * e1000_intr - Interrupt Handler
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1592
 * @irq: interrupt number
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1593
 * @data: pointer to a network interface device structure
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1594
 **/
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1595
static irqreturn_t e1000_intr(int irq, void *data)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1596
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1597
	struct net_device *netdev = data;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1598
	struct e1000_adapter *adapter = netdev_priv(netdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1599
	struct e1000_hw *hw = &adapter->hw;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1600
	u32 rctl, icr = er32(ICR);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1601
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1602
	if (!icr || test_bit(__E1000_DOWN, &adapter->state))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1603
		return IRQ_NONE;  /* Not our interrupt */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1604
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1605
	/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1606
	 * IMS will not auto-mask if INT_ASSERTED is not set, and if it is
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1607
	 * not set, then the adapter didn't send an interrupt
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1608
	 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1609
	if (!adapter->ecdev && !(icr & E1000_ICR_INT_ASSERTED))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1610
		return IRQ_NONE;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1611
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1612
	/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1613
	 * Interrupt Auto-Mask...upon reading ICR,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1614
	 * interrupts are masked.  No need for the
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1615
	 * IMC write
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1616
	 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1617
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1618
	if (!adapter->ecdev && (icr & E1000_ICR_LSC)) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1619
		hw->mac.get_link_status = 1;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1620
		/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1621
		 * ICH8 workaround-- Call gig speed drop workaround on cable
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1622
		 * disconnect (LSC) before accessing any PHY registers
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1623
		 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1624
		if ((adapter->flags & FLAG_LSC_GIG_SPEED_DROP) &&
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1625
		    (!(er32(STATUS) & E1000_STATUS_LU)))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1626
			schedule_work(&adapter->downshift_task);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1627
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1628
		/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1629
		 * 80003ES2LAN workaround--
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1630
		 * For packet buffer work-around on link down event;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1631
		 * disable receives here in the ISR and
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1632
		 * reset adapter in watchdog
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1633
		 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1634
		if (netif_carrier_ok(netdev) &&
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1635
		    (adapter->flags & FLAG_RX_NEEDS_RESTART)) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1636
			/* disable receives */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1637
			rctl = er32(RCTL);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1638
			ew32(RCTL, rctl & ~E1000_RCTL_EN);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1639
			adapter->flags |= FLAG_RX_RESTART_NOW;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1640
		}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1641
		/* guard against interrupt when we're going down */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1642
		if (!test_bit(__E1000_DOWN, &adapter->state))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1643
			mod_timer(&adapter->watchdog_timer, jiffies + 1);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1644
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1645
2473
f62b64fdbc23 Fixed e1000_open() in e1000e drivers.
Florian Pose <fp@igh-essen.com>
parents: 2472
diff changeset
  1646
	if (adapter->ecdev) {
f62b64fdbc23 Fixed e1000_open() in e1000e drivers.
Florian Pose <fp@igh-essen.com>
parents: 2472
diff changeset
  1647
		int ec_work_done = 0;
f62b64fdbc23 Fixed e1000_open() in e1000e drivers.
Florian Pose <fp@igh-essen.com>
parents: 2472
diff changeset
  1648
		adapter->clean_rx(adapter, &ec_work_done, 100);
f62b64fdbc23 Fixed e1000_open() in e1000e drivers.
Florian Pose <fp@igh-essen.com>
parents: 2472
diff changeset
  1649
		e1000_clean_tx_irq(adapter);
2219
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1650
		return IRQ_HANDLED;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1651
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1652
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1653
	if (napi_schedule_prep(&adapter->napi)) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1654
		adapter->total_tx_bytes = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1655
		adapter->total_tx_packets = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1656
		adapter->total_rx_bytes = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1657
		adapter->total_rx_packets = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1658
		__napi_schedule(&adapter->napi);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1659
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1660
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1661
	return IRQ_HANDLED;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1662
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1663
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1664
static irqreturn_t e1000_msix_other(int irq, void *data)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1665
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1666
	struct net_device *netdev = data;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1667
	struct e1000_adapter *adapter = netdev_priv(netdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1668
	struct e1000_hw *hw = &adapter->hw;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1669
	u32 icr = er32(ICR);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1670
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1671
	if (!(icr & E1000_ICR_INT_ASSERTED)) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1672
		if (!test_bit(__E1000_DOWN, &adapter->state))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1673
			ew32(IMS, E1000_IMS_OTHER);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1674
		return IRQ_NONE;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1675
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1676
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1677
	if (icr & adapter->eiac_mask)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1678
		ew32(ICS, (icr & adapter->eiac_mask));
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1679
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1680
	if (icr & E1000_ICR_OTHER) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1681
		if (!(icr & E1000_ICR_LSC))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1682
			goto no_link_interrupt;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1683
		hw->mac.get_link_status = 1;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1684
		/* guard against interrupt when we're going down */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1685
		if (!adapter->ecdev && !test_bit(__E1000_DOWN, &adapter->state))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1686
			mod_timer(&adapter->watchdog_timer, jiffies + 1);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1687
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1688
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1689
no_link_interrupt:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1690
	if (!test_bit(__E1000_DOWN, &adapter->state))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1691
		ew32(IMS, E1000_IMS_LSC | E1000_IMS_OTHER);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1692
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1693
	return IRQ_HANDLED;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1694
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1695
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1696
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1697
static irqreturn_t e1000_intr_msix_tx(int irq, void *data)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1698
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1699
	struct net_device *netdev = data;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1700
	struct e1000_adapter *adapter = netdev_priv(netdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1701
	struct e1000_hw *hw = &adapter->hw;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1702
	struct e1000_ring *tx_ring = adapter->tx_ring;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1703
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1704
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1705
	adapter->total_tx_bytes = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1706
	adapter->total_tx_packets = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1707
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1708
	if (!e1000_clean_tx_irq(adapter))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1709
		/* Ring was not completely cleaned, so fire another interrupt */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1710
		ew32(ICS, tx_ring->ims_val);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1711
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1712
	return IRQ_HANDLED;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1713
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1714
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1715
static irqreturn_t e1000_intr_msix_rx(int irq, void *data)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1716
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1717
	struct net_device *netdev = data;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1718
	struct e1000_adapter *adapter = netdev_priv(netdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1719
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1720
	/* Write the ITR value calculated at the end of the
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1721
	 * previous interrupt.
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1722
	 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1723
	if (adapter->rx_ring->set_itr) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1724
		writel(1000000000 / (adapter->rx_ring->itr_val * 256),
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1725
		       adapter->hw.hw_addr + adapter->rx_ring->itr_register);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1726
		adapter->rx_ring->set_itr = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1727
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1728
2473
f62b64fdbc23 Fixed e1000_open() in e1000e drivers.
Florian Pose <fp@igh-essen.com>
parents: 2472
diff changeset
  1729
	if (adapter->ecdev) {
f62b64fdbc23 Fixed e1000_open() in e1000e drivers.
Florian Pose <fp@igh-essen.com>
parents: 2472
diff changeset
  1730
		int ec_work_done = 0;
f62b64fdbc23 Fixed e1000_open() in e1000e drivers.
Florian Pose <fp@igh-essen.com>
parents: 2472
diff changeset
  1731
		adapter->clean_rx(adapter, &ec_work_done, 100);
2219
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1732
	} else {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1733
		if (napi_schedule_prep(&adapter->napi)) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1734
			adapter->total_rx_bytes = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1735
			adapter->total_rx_packets = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1736
			__napi_schedule(&adapter->napi);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1737
		}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1738
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1739
	return IRQ_HANDLED;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1740
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1741
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1742
/**
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1743
 * e1000_configure_msix - Configure MSI-X hardware
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1744
 *
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1745
 * e1000_configure_msix sets up the hardware to properly
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1746
 * generate MSI-X interrupts.
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1747
 **/
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1748
static void e1000_configure_msix(struct e1000_adapter *adapter)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1749
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1750
	struct e1000_hw *hw = &adapter->hw;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1751
	struct e1000_ring *rx_ring = adapter->rx_ring;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1752
	struct e1000_ring *tx_ring = adapter->tx_ring;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1753
	int vector = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1754
	u32 ctrl_ext, ivar = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1755
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1756
	adapter->eiac_mask = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1757
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1758
	/* Workaround issue with spurious interrupts on 82574 in MSI-X mode */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1759
	if (hw->mac.type == e1000_82574) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1760
		u32 rfctl = er32(RFCTL);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1761
		rfctl |= E1000_RFCTL_ACK_DIS;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1762
		ew32(RFCTL, rfctl);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1763
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1764
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1765
#define E1000_IVAR_INT_ALLOC_VALID	0x8
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1766
	/* Configure Rx vector */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1767
	rx_ring->ims_val = E1000_IMS_RXQ0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1768
	adapter->eiac_mask |= rx_ring->ims_val;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1769
	if (rx_ring->itr_val)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1770
		writel(1000000000 / (rx_ring->itr_val * 256),
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1771
		       hw->hw_addr + rx_ring->itr_register);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1772
	else
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1773
		writel(1, hw->hw_addr + rx_ring->itr_register);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1774
	ivar = E1000_IVAR_INT_ALLOC_VALID | vector;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1775
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1776
	/* Configure Tx vector */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1777
	tx_ring->ims_val = E1000_IMS_TXQ0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1778
	vector++;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1779
	if (tx_ring->itr_val)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1780
		writel(1000000000 / (tx_ring->itr_val * 256),
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1781
		       hw->hw_addr + tx_ring->itr_register);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1782
	else
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1783
		writel(1, hw->hw_addr + tx_ring->itr_register);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1784
	adapter->eiac_mask |= tx_ring->ims_val;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1785
	ivar |= ((E1000_IVAR_INT_ALLOC_VALID | vector) << 8);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1786
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1787
	/* set vector for Other Causes, e.g. link changes */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1788
	vector++;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1789
	ivar |= ((E1000_IVAR_INT_ALLOC_VALID | vector) << 16);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1790
	if (rx_ring->itr_val)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1791
		writel(1000000000 / (rx_ring->itr_val * 256),
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1792
		       hw->hw_addr + E1000_EITR_82574(vector));
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1793
	else
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1794
		writel(1, hw->hw_addr + E1000_EITR_82574(vector));
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1795
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1796
	/* Cause Tx interrupts on every write back */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1797
	ivar |= (1 << 31);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1798
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1799
	ew32(IVAR, ivar);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1800
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1801
	/* enable MSI-X PBA support */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1802
	ctrl_ext = er32(CTRL_EXT);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1803
	ctrl_ext |= E1000_CTRL_EXT_PBA_CLR;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1804
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1805
	/* Auto-Mask Other interrupts upon ICR read */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1806
#define E1000_EIAC_MASK_82574   0x01F00000
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1807
	ew32(IAM, ~E1000_EIAC_MASK_82574 | E1000_IMS_OTHER);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1808
	ctrl_ext |= E1000_CTRL_EXT_EIAME;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1809
	ew32(CTRL_EXT, ctrl_ext);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1810
	e1e_flush();
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1811
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1812
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1813
void e1000e_reset_interrupt_capability(struct e1000_adapter *adapter)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1814
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1815
	if (adapter->msix_entries) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1816
		pci_disable_msix(adapter->pdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1817
		kfree(adapter->msix_entries);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1818
		adapter->msix_entries = NULL;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1819
	} else if (adapter->flags & FLAG_MSI_ENABLED) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1820
		pci_disable_msi(adapter->pdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1821
		adapter->flags &= ~FLAG_MSI_ENABLED;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1822
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1823
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1824
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1825
/**
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1826
 * e1000e_set_interrupt_capability - set MSI or MSI-X if supported
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1827
 *
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1828
 * Attempt to configure interrupts using the best available
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1829
 * capabilities of the hardware and kernel.
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1830
 **/
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1831
void e1000e_set_interrupt_capability(struct e1000_adapter *adapter)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1832
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1833
	int err;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1834
	int i;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1835
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1836
	switch (adapter->int_mode) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1837
	case E1000E_INT_MODE_MSIX:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1838
		if (adapter->flags & FLAG_HAS_MSIX) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1839
			adapter->num_vectors = 3; /* RxQ0, TxQ0 and other */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1840
			adapter->msix_entries = kcalloc(adapter->num_vectors,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1841
						      sizeof(struct msix_entry),
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1842
						      GFP_KERNEL);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1843
			if (adapter->msix_entries) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1844
				for (i = 0; i < adapter->num_vectors; i++)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1845
					adapter->msix_entries[i].entry = i;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1846
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1847
				err = pci_enable_msix(adapter->pdev,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1848
						      adapter->msix_entries,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1849
						      adapter->num_vectors);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1850
				if (err == 0) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1851
					return;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1852
				}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1853
			}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1854
			/* MSI-X failed, so fall through and try MSI */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1855
			e_err("Failed to initialize MSI-X interrupts.  "
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1856
			      "Falling back to MSI interrupts.\n");
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1857
			e1000e_reset_interrupt_capability(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1858
		}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1859
		adapter->int_mode = E1000E_INT_MODE_MSI;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1860
		/* Fall through */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1861
	case E1000E_INT_MODE_MSI:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1862
		if (!pci_enable_msi(adapter->pdev)) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1863
			adapter->flags |= FLAG_MSI_ENABLED;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1864
		} else {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1865
			adapter->int_mode = E1000E_INT_MODE_LEGACY;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1866
			e_err("Failed to initialize MSI interrupts.  Falling "
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1867
			      "back to legacy interrupts.\n");
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1868
		}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1869
		/* Fall through */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1870
	case E1000E_INT_MODE_LEGACY:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1871
		/* Don't do anything; this is the system default */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1872
		break;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1873
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1874
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1875
	/* store the number of vectors being used */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1876
	adapter->num_vectors = 1;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1877
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1878
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1879
/**
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1880
 * e1000_request_msix - Initialize MSI-X interrupts
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1881
 *
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1882
 * e1000_request_msix allocates MSI-X vectors and requests interrupts from the
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1883
 * kernel.
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1884
 **/
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1885
static int e1000_request_msix(struct e1000_adapter *adapter)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1886
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1887
	struct net_device *netdev = adapter->netdev;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1888
	int err = 0, vector = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1889
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1890
	if (strlen(netdev->name) < (IFNAMSIZ - 5))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1891
		sprintf(adapter->rx_ring->name, "%s-rx-0", netdev->name);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1892
	else
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1893
		memcpy(adapter->rx_ring->name, netdev->name, IFNAMSIZ);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1894
	err = request_irq(adapter->msix_entries[vector].vector,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1895
			  e1000_intr_msix_rx, entropy ? IRQF_SAMPLE_RANDOM : 0,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1896
			  adapter->rx_ring->name, netdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1897
	if (err)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1898
		goto out;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1899
	adapter->rx_ring->itr_register = E1000_EITR_82574(vector);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1900
	adapter->rx_ring->itr_val = adapter->itr;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1901
	vector++;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1902
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1903
	if (strlen(netdev->name) < (IFNAMSIZ - 5))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1904
		sprintf(adapter->tx_ring->name, "%s-tx-0", netdev->name);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1905
	else
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1906
		memcpy(adapter->tx_ring->name, netdev->name, IFNAMSIZ);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1907
	err = request_irq(adapter->msix_entries[vector].vector,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1908
			  e1000_intr_msix_tx, 0, adapter->tx_ring->name,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1909
			  netdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1910
	if (err)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1911
		goto out;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1912
	adapter->tx_ring->itr_register = E1000_EITR_82574(vector);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1913
	adapter->tx_ring->itr_val = adapter->itr;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1914
	vector++;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1915
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1916
	err = request_irq(adapter->msix_entries[vector].vector,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1917
			  e1000_msix_other, 0, netdev->name, netdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1918
	if (err)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1919
		goto out;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1920
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1921
	e1000_configure_msix(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1922
	return 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1923
out:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1924
	return err;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1925
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1926
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1927
/**
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1928
 * e1000_request_irq - initialize interrupts
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1929
 *
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1930
 * Attempts to configure interrupts using the best available
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1931
 * capabilities of the hardware and kernel.
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1932
 **/
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1933
static int e1000_request_irq(struct e1000_adapter *adapter)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1934
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1935
	struct net_device *netdev = adapter->netdev;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1936
	int err;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1937
	int irq_flags = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1938
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1939
	if (adapter->ecdev)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1940
		return 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1941
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1942
	if (adapter->msix_entries) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1943
		err = e1000_request_msix(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1944
		if (!err)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1945
			return err;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1946
		/* fall back to MSI */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1947
		e1000e_reset_interrupt_capability(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1948
		adapter->int_mode = E1000E_INT_MODE_MSI;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1949
		e1000e_set_interrupt_capability(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1950
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1951
	if (adapter->flags & FLAG_MSI_ENABLED) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1952
		err = request_irq(adapter->pdev->irq, e1000_intr_msi,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1953
				  entropy ? IRQF_SAMPLE_RANDOM : 0,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1954
				  netdev->name, netdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1955
		if (!err)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1956
			return err;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1957
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1958
		/* fall back to legacy interrupt */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1959
		e1000e_reset_interrupt_capability(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1960
		adapter->int_mode = E1000E_INT_MODE_LEGACY;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1961
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1962
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1963
	if (entropy)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1964
		irq_flags |= IRQF_SAMPLE_RANDOM;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1965
	err = request_irq(adapter->pdev->irq, e1000_intr,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1966
			  irq_flags | IRQF_SHARED, netdev->name, netdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1967
	if (err)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1968
		e_err("Unable to allocate interrupt, Error: %d\n", err);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1969
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1970
	return err;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1971
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1972
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1973
static void e1000_free_irq(struct e1000_adapter *adapter)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1974
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1975
	struct net_device *netdev = adapter->netdev;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1976
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1977
	if (adapter->ecdev)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1978
		return;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1979
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1980
	if (adapter->msix_entries) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1981
		int vector = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1982
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1983
		free_irq(adapter->msix_entries[vector].vector, netdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1984
		vector++;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1985
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1986
		free_irq(adapter->msix_entries[vector].vector, netdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1987
		vector++;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1988
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1989
		/* Other Causes interrupt vector */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1990
		free_irq(adapter->msix_entries[vector].vector, netdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1991
		return;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1992
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1993
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1994
	free_irq(adapter->pdev->irq, netdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1995
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1996
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1997
/**
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1998
 * e1000_irq_disable - Mask off interrupt generation on the NIC
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1999
 **/
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2000
static void e1000_irq_disable(struct e1000_adapter *adapter)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2001
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2002
	struct e1000_hw *hw = &adapter->hw;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2003
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2004
	if (adapter->ecdev)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2005
		return;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2006
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2007
	ew32(IMC, ~0);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2008
	if (adapter->msix_entries)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2009
		ew32(EIAC_82574, 0);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2010
	e1e_flush();
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2011
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2012
	if (adapter->msix_entries) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2013
		int i;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2014
		for (i = 0; i < adapter->num_vectors; i++)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2015
			synchronize_irq(adapter->msix_entries[i].vector);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2016
	} else {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2017
		synchronize_irq(adapter->pdev->irq);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2018
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2019
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2020
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2021
/**
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2022
 * e1000_irq_enable - Enable default interrupt generation settings
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2023
 **/
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2024
static void e1000_irq_enable(struct e1000_adapter *adapter)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2025
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2026
	struct e1000_hw *hw = &adapter->hw;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2027
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2028
	if (adapter->ecdev)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2029
		return;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2030
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2031
	if (adapter->msix_entries) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2032
		ew32(EIAC_82574, adapter->eiac_mask & E1000_EIAC_MASK_82574);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2033
		ew32(IMS, adapter->eiac_mask | E1000_IMS_OTHER | E1000_IMS_LSC);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2034
	} else {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2035
		ew32(IMS, IMS_ENABLE_MASK);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2036
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2037
	e1e_flush();
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2038
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2039
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2040
/**
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2041
 * e1000_get_hw_control - get control of the h/w from f/w
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2042
 * @adapter: address of board private structure
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2043
 *
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2044
 * e1000_get_hw_control sets {CTRL_EXT|SWSM}:DRV_LOAD bit.
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2045
 * For ASF and Pass Through versions of f/w this means that
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2046
 * the driver is loaded. For AMT version (only with 82573)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2047
 * of the f/w this means that the network i/f is open.
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2048
 **/
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2049
static void e1000_get_hw_control(struct e1000_adapter *adapter)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2050
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2051
	struct e1000_hw *hw = &adapter->hw;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2052
	u32 ctrl_ext;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2053
	u32 swsm;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2054
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2055
	/* Let firmware know the driver has taken over */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2056
	if (adapter->flags & FLAG_HAS_SWSM_ON_LOAD) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2057
		swsm = er32(SWSM);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2058
		ew32(SWSM, swsm | E1000_SWSM_DRV_LOAD);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2059
	} else if (adapter->flags & FLAG_HAS_CTRLEXT_ON_LOAD) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2060
		ctrl_ext = er32(CTRL_EXT);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2061
		ew32(CTRL_EXT, ctrl_ext | E1000_CTRL_EXT_DRV_LOAD);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2062
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2063
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2064
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2065
/**
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2066
 * e1000_release_hw_control - release control of the h/w to f/w
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2067
 * @adapter: address of board private structure
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2068
 *
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2069
 * e1000_release_hw_control resets {CTRL_EXT|SWSM}:DRV_LOAD bit.
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2070
 * For ASF and Pass Through versions of f/w this means that the
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2071
 * driver is no longer loaded. For AMT version (only with 82573) i
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2072
 * of the f/w this means that the network i/f is closed.
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2073
 *
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2074
 **/
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2075
static void e1000_release_hw_control(struct e1000_adapter *adapter)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2076
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2077
	struct e1000_hw *hw = &adapter->hw;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2078
	u32 ctrl_ext;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2079
	u32 swsm;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2080
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2081
	/* Let firmware taken over control of h/w */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2082
	if (adapter->flags & FLAG_HAS_SWSM_ON_LOAD) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2083
		swsm = er32(SWSM);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2084
		ew32(SWSM, swsm & ~E1000_SWSM_DRV_LOAD);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2085
	} else if (adapter->flags & FLAG_HAS_CTRLEXT_ON_LOAD) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2086
		ctrl_ext = er32(CTRL_EXT);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2087
		ew32(CTRL_EXT, ctrl_ext & ~E1000_CTRL_EXT_DRV_LOAD);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2088
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2089
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2090
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2091
/**
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2092
 * @e1000_alloc_ring - allocate memory for a ring structure
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2093
 **/
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2094
static int e1000_alloc_ring_dma(struct e1000_adapter *adapter,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2095
				struct e1000_ring *ring)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2096
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2097
	struct pci_dev *pdev = adapter->pdev;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2098
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2099
	ring->desc = dma_alloc_coherent(&pdev->dev, ring->size, &ring->dma,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2100
					GFP_KERNEL);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2101
	if (!ring->desc)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2102
		return -ENOMEM;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2103
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2104
	return 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2105
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2106
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2107
/**
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2108
 * e1000e_setup_tx_resources - allocate Tx resources (Descriptors)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2109
 * @adapter: board private structure
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2110
 *
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2111
 * Return 0 on success, negative on failure
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2112
 **/
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2113
int e1000e_setup_tx_resources(struct e1000_adapter *adapter)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2114
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2115
	struct e1000_ring *tx_ring = adapter->tx_ring;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2116
	int err = -ENOMEM, size;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2117
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2118
	size = sizeof(struct e1000_buffer) * tx_ring->count;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2119
	tx_ring->buffer_info = vmalloc(size);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2120
	if (!tx_ring->buffer_info)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2121
		goto err;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2122
	memset(tx_ring->buffer_info, 0, size);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2123
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2124
	/* round up to nearest 4K */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2125
	tx_ring->size = tx_ring->count * sizeof(struct e1000_tx_desc);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2126
	tx_ring->size = ALIGN(tx_ring->size, 4096);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2127
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2128
	err = e1000_alloc_ring_dma(adapter, tx_ring);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2129
	if (err)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2130
		goto err;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2131
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2132
	tx_ring->next_to_use = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2133
	tx_ring->next_to_clean = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2134
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2135
	return 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2136
err:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2137
	vfree(tx_ring->buffer_info);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2138
	e_err("Unable to allocate memory for the transmit descriptor ring\n");
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2139
	return err;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2140
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2141
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2142
/**
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2143
 * e1000e_setup_rx_resources - allocate Rx resources (Descriptors)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2144
 * @adapter: board private structure
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2145
 *
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2146
 * Returns 0 on success, negative on failure
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2147
 **/
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2148
int e1000e_setup_rx_resources(struct e1000_adapter *adapter)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2149
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2150
	struct e1000_ring *rx_ring = adapter->rx_ring;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2151
	struct e1000_buffer *buffer_info;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2152
	int i, size, desc_len, err = -ENOMEM;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2153
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2154
	size = sizeof(struct e1000_buffer) * rx_ring->count;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2155
	rx_ring->buffer_info = vmalloc(size);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2156
	if (!rx_ring->buffer_info)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2157
		goto err;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2158
	memset(rx_ring->buffer_info, 0, size);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2159
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2160
	for (i = 0; i < rx_ring->count; i++) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2161
		buffer_info = &rx_ring->buffer_info[i];
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2162
		buffer_info->ps_pages = kcalloc(PS_PAGE_BUFFERS,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2163
						sizeof(struct e1000_ps_page),
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2164
						GFP_KERNEL);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2165
		if (!buffer_info->ps_pages)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2166
			goto err_pages;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2167
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2168
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2169
	desc_len = sizeof(union e1000_rx_desc_packet_split);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2170
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2171
	/* Round up to nearest 4K */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2172
	rx_ring->size = rx_ring->count * desc_len;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2173
	rx_ring->size = ALIGN(rx_ring->size, 4096);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2174
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2175
	err = e1000_alloc_ring_dma(adapter, rx_ring);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2176
	if (err)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2177
		goto err_pages;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2178
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2179
	rx_ring->next_to_clean = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2180
	rx_ring->next_to_use = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2181
	rx_ring->rx_skb_top = NULL;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2182
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2183
	return 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2184
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2185
err_pages:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2186
	for (i = 0; i < rx_ring->count; i++) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2187
		buffer_info = &rx_ring->buffer_info[i];
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2188
		kfree(buffer_info->ps_pages);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2189
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2190
err:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2191
	vfree(rx_ring->buffer_info);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2192
	e_err("Unable to allocate memory for the transmit descriptor ring\n");
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2193
	return err;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2194
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2195
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2196
/**
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2197
 * e1000_clean_tx_ring - Free Tx Buffers
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2198
 * @adapter: board private structure
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2199
 **/
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2200
static void e1000_clean_tx_ring(struct e1000_adapter *adapter)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2201
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2202
	struct e1000_ring *tx_ring = adapter->tx_ring;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2203
	struct e1000_buffer *buffer_info;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2204
	unsigned long size;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2205
	unsigned int i;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2206
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2207
	for (i = 0; i < tx_ring->count; i++) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2208
		buffer_info = &tx_ring->buffer_info[i];
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2209
		e1000_put_txbuf(adapter, buffer_info);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2210
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2211
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2212
	size = sizeof(struct e1000_buffer) * tx_ring->count;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2213
	memset(tx_ring->buffer_info, 0, size);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2214
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2215
	memset(tx_ring->desc, 0, tx_ring->size);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2216
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2217
	tx_ring->next_to_use = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2218
	tx_ring->next_to_clean = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2219
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2220
	writel(0, adapter->hw.hw_addr + tx_ring->head);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2221
	writel(0, adapter->hw.hw_addr + tx_ring->tail);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2222
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2223
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2224
/**
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2225
 * e1000e_free_tx_resources - Free Tx Resources per Queue
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2226
 * @adapter: board private structure
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2227
 *
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2228
 * Free all transmit software resources
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2229
 **/
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2230
void e1000e_free_tx_resources(struct e1000_adapter *adapter)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2231
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2232
	struct pci_dev *pdev = adapter->pdev;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2233
	struct e1000_ring *tx_ring = adapter->tx_ring;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2234
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2235
	e1000_clean_tx_ring(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2236
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2237
	vfree(tx_ring->buffer_info);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2238
	tx_ring->buffer_info = NULL;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2239
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2240
	dma_free_coherent(&pdev->dev, tx_ring->size, tx_ring->desc,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2241
			  tx_ring->dma);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2242
	tx_ring->desc = NULL;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2243
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2244
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2245
/**
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2246
 * e1000e_free_rx_resources - Free Rx Resources
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2247
 * @adapter: board private structure
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2248
 *
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2249
 * Free all receive software resources
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2250
 **/
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2251
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2252
void e1000e_free_rx_resources(struct e1000_adapter *adapter)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2253
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2254
	struct pci_dev *pdev = adapter->pdev;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2255
	struct e1000_ring *rx_ring = adapter->rx_ring;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2256
	int i;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2257
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2258
	e1000_clean_rx_ring(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2259
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2260
	for (i = 0; i < rx_ring->count; i++) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2261
		kfree(rx_ring->buffer_info[i].ps_pages);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2262
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2263
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2264
	vfree(rx_ring->buffer_info);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2265
	rx_ring->buffer_info = NULL;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2266
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2267
	dma_free_coherent(&pdev->dev, rx_ring->size, rx_ring->desc,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2268
			  rx_ring->dma);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2269
	rx_ring->desc = NULL;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2270
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2271
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2272
/**
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2273
 * e1000_update_itr - update the dynamic ITR value based on statistics
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2274
 * @adapter: pointer to adapter
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2275
 * @itr_setting: current adapter->itr
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2276
 * @packets: the number of packets during this measurement interval
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2277
 * @bytes: the number of bytes during this measurement interval
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2278
 *
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2279
 *      Stores a new ITR value based on packets and byte
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2280
 *      counts during the last interrupt.  The advantage of per interrupt
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2281
 *      computation is faster updates and more accurate ITR for the current
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2282
 *      traffic pattern.  Constants in this function were computed
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2283
 *      based on theoretical maximum wire speed and thresholds were set based
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2284
 *      on testing data as well as attempting to minimize response time
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2285
 *      while increasing bulk throughput.  This functionality is controlled
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2286
 *      by the InterruptThrottleRate module parameter.
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2287
 **/
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2288
static unsigned int e1000_update_itr(struct e1000_adapter *adapter,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2289
				     u16 itr_setting, int packets,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2290
				     int bytes)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2291
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2292
	unsigned int retval = itr_setting;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2293
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2294
	if (packets == 0)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2295
		goto update_itr_done;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2296
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2297
	switch (itr_setting) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2298
	case lowest_latency:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2299
		/* handle TSO and jumbo frames */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2300
		if (bytes/packets > 8000)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2301
			retval = bulk_latency;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2302
		else if ((packets < 5) && (bytes > 512)) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2303
			retval = low_latency;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2304
		}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2305
		break;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2306
	case low_latency:  /* 50 usec aka 20000 ints/s */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2307
		if (bytes > 10000) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2308
			/* this if handles the TSO accounting */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2309
			if (bytes/packets > 8000) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2310
				retval = bulk_latency;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2311
			} else if ((packets < 10) || ((bytes/packets) > 1200)) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2312
				retval = bulk_latency;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2313
			} else if ((packets > 35)) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2314
				retval = lowest_latency;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2315
			}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2316
		} else if (bytes/packets > 2000) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2317
			retval = bulk_latency;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2318
		} else if (packets <= 2 && bytes < 512) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2319
			retval = lowest_latency;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2320
		}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2321
		break;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2322
	case bulk_latency: /* 250 usec aka 4000 ints/s */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2323
		if (bytes > 25000) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2324
			if (packets > 35) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2325
				retval = low_latency;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2326
			}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2327
		} else if (bytes < 6000) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2328
			retval = low_latency;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2329
		}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2330
		break;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2331
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2332
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2333
update_itr_done:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2334
	return retval;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2335
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2336
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2337
static void e1000_set_itr(struct e1000_adapter *adapter)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2338
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2339
	struct e1000_hw *hw = &adapter->hw;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2340
	u16 current_itr;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2341
	u32 new_itr = adapter->itr;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2342
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2343
	/* for non-gigabit speeds, just fix the interrupt rate at 4000 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2344
	if (adapter->link_speed != SPEED_1000) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2345
		current_itr = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2346
		new_itr = 4000;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2347
		goto set_itr_now;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2348
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2349
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2350
	if (adapter->flags2 & FLAG2_DISABLE_AIM) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2351
		new_itr = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2352
		goto set_itr_now;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2353
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2354
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2355
	adapter->tx_itr = e1000_update_itr(adapter,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2356
				    adapter->tx_itr,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2357
				    adapter->total_tx_packets,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2358
				    adapter->total_tx_bytes);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2359
	/* conservative mode (itr 3) eliminates the lowest_latency setting */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2360
	if (adapter->itr_setting == 3 && adapter->tx_itr == lowest_latency)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2361
		adapter->tx_itr = low_latency;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2362
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2363
	adapter->rx_itr = e1000_update_itr(adapter,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2364
				    adapter->rx_itr,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2365
				    adapter->total_rx_packets,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2366
				    adapter->total_rx_bytes);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2367
	/* conservative mode (itr 3) eliminates the lowest_latency setting */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2368
	if (adapter->itr_setting == 3 && adapter->rx_itr == lowest_latency)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2369
		adapter->rx_itr = low_latency;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2370
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2371
	current_itr = max(adapter->rx_itr, adapter->tx_itr);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2372
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2373
	switch (current_itr) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2374
	/* counts and packets in update_itr are dependent on these numbers */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2375
	case lowest_latency:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2376
		new_itr = 70000;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2377
		break;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2378
	case low_latency:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2379
		new_itr = 20000; /* aka hwitr = ~200 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2380
		break;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2381
	case bulk_latency:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2382
		new_itr = 4000;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2383
		break;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2384
	default:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2385
		break;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2386
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2387
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2388
set_itr_now:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2389
	if (new_itr != adapter->itr) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2390
		/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2391
		 * this attempts to bias the interrupt rate towards Bulk
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2392
		 * by adding intermediate steps when interrupt rate is
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2393
		 * increasing
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2394
		 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2395
		new_itr = new_itr > adapter->itr ?
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2396
			     min(adapter->itr + (new_itr >> 2), new_itr) :
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2397
			     new_itr;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2398
		adapter->itr = new_itr;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2399
		adapter->rx_ring->itr_val = new_itr;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2400
		if (adapter->msix_entries)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2401
			adapter->rx_ring->set_itr = 1;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2402
		else
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2403
			if (new_itr)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2404
				ew32(ITR, 1000000000 / (new_itr * 256));
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2405
			else
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2406
				ew32(ITR, 0);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2407
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2408
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2409
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2410
/**
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2411
 * e1000_alloc_queues - Allocate memory for all rings
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2412
 * @adapter: board private structure to initialize
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2413
 **/
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2414
static int __devinit e1000_alloc_queues(struct e1000_adapter *adapter)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2415
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2416
	adapter->tx_ring = kzalloc(sizeof(struct e1000_ring), GFP_KERNEL);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2417
	if (!adapter->tx_ring)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2418
		goto err;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2419
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2420
	adapter->rx_ring = kzalloc(sizeof(struct e1000_ring), GFP_KERNEL);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2421
	if (!adapter->rx_ring)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2422
		goto err;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2423
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2424
	return 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2425
err:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2426
	e_err("Unable to allocate memory for queues\n");
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2427
	kfree(adapter->rx_ring);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2428
	kfree(adapter->tx_ring);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2429
	return -ENOMEM;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2430
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2431
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2432
/**
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2433
 * e1000_clean - NAPI Rx polling callback
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2434
 * @napi: struct associated with this polling callback
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2435
 * @budget: amount of packets driver is allowed to process this poll
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2436
 **/
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2437
static int e1000_clean(struct napi_struct *napi, int budget)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2438
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2439
	struct e1000_adapter *adapter = container_of(napi, struct e1000_adapter, napi);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2440
	struct e1000_hw *hw = &adapter->hw;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2441
	struct net_device *poll_dev = adapter->netdev;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2442
	int tx_cleaned = 1, work_done = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2443
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2444
	adapter = netdev_priv(poll_dev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2445
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2446
	if (adapter->msix_entries &&
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2447
	    !(adapter->rx_ring->ims_val & adapter->tx_ring->ims_val))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2448
		goto clean_rx;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2449
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2450
	tx_cleaned = e1000_clean_tx_irq(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2451
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2452
clean_rx:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2453
	adapter->clean_rx(adapter, &work_done, budget);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2454
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2455
	if (!tx_cleaned)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2456
		work_done = budget;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2457
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2458
	/* If budget not fully consumed, exit the polling mode */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2459
	if (work_done < budget) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2460
		if (adapter->itr_setting & 3)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2461
			e1000_set_itr(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2462
		napi_complete(napi);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2463
		if (!test_bit(__E1000_DOWN, &adapter->state)) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2464
			if (adapter->msix_entries)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2465
				ew32(IMS, adapter->rx_ring->ims_val);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2466
			else
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2467
				e1000_irq_enable(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2468
		}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2469
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2470
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2471
	return work_done;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2472
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2473
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2474
static void e1000_vlan_rx_add_vid(struct net_device *netdev, u16 vid)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2475
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2476
	struct e1000_adapter *adapter = netdev_priv(netdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2477
	struct e1000_hw *hw = &adapter->hw;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2478
	u32 vfta, index;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2479
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2480
	/* don't update vlan cookie if already programmed */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2481
	if ((adapter->hw.mng_cookie.status &
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2482
	     E1000_MNG_DHCP_COOKIE_STATUS_VLAN) &&
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2483
	    (vid == adapter->mng_vlan_id))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2484
		return;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2485
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2486
	/* add VID to filter table */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2487
	if (adapter->flags & FLAG_HAS_HW_VLAN_FILTER) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2488
		index = (vid >> 5) & 0x7F;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2489
		vfta = E1000_READ_REG_ARRAY(hw, E1000_VFTA, index);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2490
		vfta |= (1 << (vid & 0x1F));
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2491
		hw->mac.ops.write_vfta(hw, index, vfta);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2492
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2493
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2494
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2495
static void e1000_vlan_rx_kill_vid(struct net_device *netdev, u16 vid)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2496
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2497
	struct e1000_adapter *adapter = netdev_priv(netdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2498
	struct e1000_hw *hw = &adapter->hw;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2499
	u32 vfta, index;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2500
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2501
	if (!test_bit(__E1000_DOWN, &adapter->state))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2502
		e1000_irq_disable(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2503
	vlan_group_set_device(adapter->vlgrp, vid, NULL);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2504
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2505
	if (!test_bit(__E1000_DOWN, &adapter->state))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2506
		e1000_irq_enable(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2507
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2508
	if ((adapter->hw.mng_cookie.status &
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2509
	     E1000_MNG_DHCP_COOKIE_STATUS_VLAN) &&
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2510
	    (vid == adapter->mng_vlan_id)) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2511
		/* release control to f/w */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2512
		e1000_release_hw_control(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2513
		return;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2514
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2515
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2516
	/* remove VID from filter table */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2517
	if (adapter->flags & FLAG_HAS_HW_VLAN_FILTER) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2518
		index = (vid >> 5) & 0x7F;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2519
		vfta = E1000_READ_REG_ARRAY(hw, E1000_VFTA, index);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2520
		vfta &= ~(1 << (vid & 0x1F));
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2521
		hw->mac.ops.write_vfta(hw, index, vfta);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2522
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2523
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2524
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2525
static void e1000_update_mng_vlan(struct e1000_adapter *adapter)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2526
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2527
	struct net_device *netdev = adapter->netdev;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2528
	u16 vid = adapter->hw.mng_cookie.vlan_id;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2529
	u16 old_vid = adapter->mng_vlan_id;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2530
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2531
	if (!adapter->vlgrp)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2532
		return;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2533
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2534
	if (!vlan_group_get_device(adapter->vlgrp, vid)) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2535
		adapter->mng_vlan_id = E1000_MNG_VLAN_NONE;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2536
		if (adapter->hw.mng_cookie.status &
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2537
			E1000_MNG_DHCP_COOKIE_STATUS_VLAN) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2538
			e1000_vlan_rx_add_vid(netdev, vid);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2539
			adapter->mng_vlan_id = vid;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2540
		}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2541
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2542
		if ((old_vid != (u16)E1000_MNG_VLAN_NONE) &&
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2543
				(vid != old_vid) &&
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2544
		    !vlan_group_get_device(adapter->vlgrp, old_vid))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2545
			e1000_vlan_rx_kill_vid(netdev, old_vid);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2546
	} else {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2547
		adapter->mng_vlan_id = vid;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2548
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2549
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2550
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2551
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2552
static void e1000_vlan_rx_register(struct net_device *netdev,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2553
				   struct vlan_group *grp)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2554
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2555
	struct e1000_adapter *adapter = netdev_priv(netdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2556
	struct e1000_hw *hw = &adapter->hw;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2557
	u32 ctrl, rctl;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2558
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2559
	if (!test_bit(__E1000_DOWN, &adapter->state))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2560
		e1000_irq_disable(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2561
	adapter->vlgrp = grp;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2562
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2563
	if (grp) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2564
		/* enable VLAN tag insert/strip */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2565
		ctrl = er32(CTRL);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2566
		ctrl |= E1000_CTRL_VME;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2567
		ew32(CTRL, ctrl);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2568
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2569
		if (adapter->flags & FLAG_HAS_HW_VLAN_FILTER) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2570
			/* enable VLAN receive filtering */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2571
			rctl = er32(RCTL);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2572
			rctl &= ~E1000_RCTL_CFIEN;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2573
			ew32(RCTL, rctl);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2574
			e1000_update_mng_vlan(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2575
		}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2576
	} else {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2577
		/* disable VLAN tag insert/strip */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2578
		ctrl = er32(CTRL);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2579
		ctrl &= ~E1000_CTRL_VME;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2580
		ew32(CTRL, ctrl);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2581
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2582
		if (adapter->flags & FLAG_HAS_HW_VLAN_FILTER) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2583
			if (adapter->mng_vlan_id !=
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2584
			    (u16)E1000_MNG_VLAN_NONE) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2585
				e1000_vlan_rx_kill_vid(netdev,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2586
						       adapter->mng_vlan_id);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2587
				adapter->mng_vlan_id = E1000_MNG_VLAN_NONE;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2588
			}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2589
		}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2590
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2591
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2592
	if (!test_bit(__E1000_DOWN, &adapter->state))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2593
		e1000_irq_enable(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2594
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2595
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2596
static void e1000_restore_vlan(struct e1000_adapter *adapter)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2597
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2598
	u16 vid;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2599
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2600
	e1000_vlan_rx_register(adapter->netdev, adapter->vlgrp);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2601
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2602
	if (!adapter->vlgrp)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2603
		return;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2604
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2605
	for (vid = 0; vid < VLAN_N_VID; vid++) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2606
		if (!vlan_group_get_device(adapter->vlgrp, vid))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2607
			continue;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2608
		e1000_vlan_rx_add_vid(adapter->netdev, vid);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2609
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2610
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2611
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2612
static void e1000_init_manageability_pt(struct e1000_adapter *adapter)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2613
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2614
	struct e1000_hw *hw = &adapter->hw;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2615
	u32 manc, manc2h, mdef, i, j;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2616
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2617
	if (!(adapter->flags & FLAG_MNG_PT_ENABLED))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2618
		return;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2619
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2620
	manc = er32(MANC);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2621
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2622
	/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2623
	 * enable receiving management packets to the host. this will probably
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2624
	 * generate destination unreachable messages from the host OS, but
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2625
	 * the packets will be handled on SMBUS
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2626
	 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2627
	manc |= E1000_MANC_EN_MNG2HOST;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2628
	manc2h = er32(MANC2H);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2629
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2630
	switch (hw->mac.type) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2631
	default:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2632
		manc2h |= (E1000_MANC2H_PORT_623 | E1000_MANC2H_PORT_664);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2633
		break;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2634
	case e1000_82574:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2635
	case e1000_82583:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2636
		/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2637
		 * Check if IPMI pass-through decision filter already exists;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2638
		 * if so, enable it.
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2639
		 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2640
		for (i = 0, j = 0; i < 8; i++) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2641
			mdef = er32(MDEF(i));
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2642
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2643
			/* Ignore filters with anything other than IPMI ports */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2644
			if (mdef & ~(E1000_MDEF_PORT_623 | E1000_MDEF_PORT_664))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2645
				continue;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2646
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2647
			/* Enable this decision filter in MANC2H */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2648
			if (mdef)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2649
				manc2h |= (1 << i);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2650
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2651
			j |= mdef;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2652
		}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2653
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2654
		if (j == (E1000_MDEF_PORT_623 | E1000_MDEF_PORT_664))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2655
			break;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2656
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2657
		/* Create new decision filter in an empty filter */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2658
		for (i = 0, j = 0; i < 8; i++)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2659
			if (er32(MDEF(i)) == 0) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2660
				ew32(MDEF(i), (E1000_MDEF_PORT_623 |
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2661
					       E1000_MDEF_PORT_664));
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2662
				manc2h |= (1 << 1);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2663
				j++;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2664
				break;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2665
			}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2666
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2667
		if (!j)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2668
			e_warn("Unable to create IPMI pass-through filter\n");
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2669
		break;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2670
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2671
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2672
	ew32(MANC2H, manc2h);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2673
	ew32(MANC, manc);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2674
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2675
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2676
/**
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2677
 * e1000_configure_tx - Configure 8254x Transmit Unit after Reset
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2678
 * @adapter: board private structure
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2679
 *
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2680
 * Configure the Tx unit of the MAC after a reset.
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2681
 **/
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2682
static void e1000_configure_tx(struct e1000_adapter *adapter)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2683
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2684
	struct e1000_hw *hw = &adapter->hw;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2685
	struct e1000_ring *tx_ring = adapter->tx_ring;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2686
	u64 tdba;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2687
	u32 tdlen, tctl, tipg, tarc;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2688
	u32 ipgr1, ipgr2;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2689
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2690
	/* Setup the HW Tx Head and Tail descriptor pointers */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2691
	tdba = tx_ring->dma;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2692
	tdlen = tx_ring->count * sizeof(struct e1000_tx_desc);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2693
	ew32(TDBAL, (tdba & DMA_BIT_MASK(32)));
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2694
	ew32(TDBAH, (tdba >> 32));
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2695
	ew32(TDLEN, tdlen);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2696
	ew32(TDH, 0);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2697
	ew32(TDT, 0);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2698
	tx_ring->head = E1000_TDH;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2699
	tx_ring->tail = E1000_TDT;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2700
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2701
	/* Set the default values for the Tx Inter Packet Gap timer */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2702
	tipg = DEFAULT_82543_TIPG_IPGT_COPPER;          /*  8  */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2703
	ipgr1 = DEFAULT_82543_TIPG_IPGR1;               /*  8  */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2704
	ipgr2 = DEFAULT_82543_TIPG_IPGR2;               /*  6  */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2705
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2706
	if (adapter->flags & FLAG_TIPG_MEDIUM_FOR_80003ESLAN)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2707
		ipgr2 = DEFAULT_80003ES2LAN_TIPG_IPGR2; /*  7  */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2708
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2709
	tipg |= ipgr1 << E1000_TIPG_IPGR1_SHIFT;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2710
	tipg |= ipgr2 << E1000_TIPG_IPGR2_SHIFT;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2711
	ew32(TIPG, tipg);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2712
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2713
	/* Set the Tx Interrupt Delay register */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2714
	ew32(TIDV, adapter->tx_int_delay);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2715
	/* Tx irq moderation */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2716
	ew32(TADV, adapter->tx_abs_int_delay);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2717
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2718
	if (adapter->flags2 & FLAG2_DMA_BURST) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2719
		u32 txdctl = er32(TXDCTL(0));
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2720
		txdctl &= ~(E1000_TXDCTL_PTHRESH | E1000_TXDCTL_HTHRESH |
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2721
			    E1000_TXDCTL_WTHRESH);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2722
		/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2723
		 * set up some performance related parameters to encourage the
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2724
		 * hardware to use the bus more efficiently in bursts, depends
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2725
		 * on the tx_int_delay to be enabled,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2726
		 * wthresh = 5 ==> burst write a cacheline (64 bytes) at a time
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2727
		 * hthresh = 1 ==> prefetch when one or more available
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2728
		 * pthresh = 0x1f ==> prefetch if internal cache 31 or less
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2729
		 * BEWARE: this seems to work but should be considered first if
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2730
		 * there are tx hangs or other tx related bugs
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2731
		 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2732
		txdctl |= E1000_TXDCTL_DMA_BURST_ENABLE;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2733
		ew32(TXDCTL(0), txdctl);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2734
		/* erratum work around: set txdctl the same for both queues */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2735
		ew32(TXDCTL(1), txdctl);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2736
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2737
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2738
	/* Program the Transmit Control Register */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2739
	tctl = er32(TCTL);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2740
	tctl &= ~E1000_TCTL_CT;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2741
	tctl |= E1000_TCTL_PSP | E1000_TCTL_RTLC |
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2742
		(E1000_COLLISION_THRESHOLD << E1000_CT_SHIFT);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2743
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2744
	if (adapter->flags & FLAG_TARC_SPEED_MODE_BIT) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2745
		tarc = er32(TARC(0));
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2746
		/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2747
		 * set the speed mode bit, we'll clear it if we're not at
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2748
		 * gigabit link later
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2749
		 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2750
#define SPEED_MODE_BIT (1 << 21)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2751
		tarc |= SPEED_MODE_BIT;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2752
		ew32(TARC(0), tarc);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2753
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2754
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2755
	/* errata: program both queues to unweighted RR */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2756
	if (adapter->flags & FLAG_TARC_SET_BIT_ZERO) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2757
		tarc = er32(TARC(0));
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2758
		tarc |= 1;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2759
		ew32(TARC(0), tarc);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2760
		tarc = er32(TARC(1));
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2761
		tarc |= 1;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2762
		ew32(TARC(1), tarc);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2763
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2764
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2765
	/* Setup Transmit Descriptor Settings for eop descriptor */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2766
	adapter->txd_cmd = E1000_TXD_CMD_EOP | E1000_TXD_CMD_IFCS;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2767
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2768
	/* only set IDE if we are delaying interrupts using the timers */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2769
	if (adapter->tx_int_delay)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2770
		adapter->txd_cmd |= E1000_TXD_CMD_IDE;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2771
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2772
	/* enable Report Status bit */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2773
	adapter->txd_cmd |= E1000_TXD_CMD_RS;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2774
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2775
	ew32(TCTL, tctl);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2776
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2777
	e1000e_config_collision_dist(hw);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2778
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2779
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2780
/**
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2781
 * e1000_setup_rctl - configure the receive control registers
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2782
 * @adapter: Board private structure
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2783
 **/
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2784
#define PAGE_USE_COUNT(S) (((S) >> PAGE_SHIFT) + \
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2785
			   (((S) & (PAGE_SIZE - 1)) ? 1 : 0))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2786
static void e1000_setup_rctl(struct e1000_adapter *adapter)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2787
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2788
	struct e1000_hw *hw = &adapter->hw;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2789
	u32 rctl, rfctl;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2790
	u32 psrctl = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2791
	u32 pages = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2792
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2793
	/* Workaround Si errata on 82579 - configure jumbo frame flow */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2794
	if (hw->mac.type == e1000_pch2lan) {
2234
18f9c69d9590 Avoided unused variable warnings.
Florian Pose <fp@igh-essen.com>
parents: 2219
diff changeset
  2795
		s32 ret_val __attribute__ ((unused));
2219
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2796
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2797
		if (adapter->netdev->mtu > ETH_DATA_LEN)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2798
			ret_val = e1000_lv_jumbo_workaround_ich8lan(hw, true);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2799
		else
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2800
			ret_val = e1000_lv_jumbo_workaround_ich8lan(hw, false);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2801
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2802
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2803
	/* Program MC offset vector base */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2804
	rctl = er32(RCTL);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2805
	rctl &= ~(3 << E1000_RCTL_MO_SHIFT);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2806
	rctl |= E1000_RCTL_EN | E1000_RCTL_BAM |
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2807
		E1000_RCTL_LBM_NO | E1000_RCTL_RDMTS_HALF |
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2808
		(adapter->hw.mac.mc_filter_type << E1000_RCTL_MO_SHIFT);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2809
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2810
	/* Do not Store bad packets */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2811
	rctl &= ~E1000_RCTL_SBP;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2812
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2813
	/* Enable Long Packet receive */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2814
	if (adapter->netdev->mtu <= ETH_DATA_LEN)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2815
		rctl &= ~E1000_RCTL_LPE;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2816
	else
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2817
		rctl |= E1000_RCTL_LPE;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2818
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2819
	/* Some systems expect that the CRC is included in SMBUS traffic. The
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2820
	 * hardware strips the CRC before sending to both SMBUS (BMC) and to
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2821
	 * host memory when this is enabled
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2822
	 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2823
	if (adapter->flags2 & FLAG2_CRC_STRIPPING)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2824
		rctl |= E1000_RCTL_SECRC;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2825
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2826
	/* Workaround Si errata on 82577 PHY - configure IPG for jumbos */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2827
	if ((hw->phy.type == e1000_phy_82577) && (rctl & E1000_RCTL_LPE)) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2828
		u16 phy_data;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2829
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2830
		e1e_rphy(hw, PHY_REG(770, 26), &phy_data);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2831
		phy_data &= 0xfff8;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2832
		phy_data |= (1 << 2);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2833
		e1e_wphy(hw, PHY_REG(770, 26), phy_data);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2834
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2835
		e1e_rphy(hw, 22, &phy_data);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2836
		phy_data &= 0x0fff;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2837
		phy_data |= (1 << 14);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2838
		e1e_wphy(hw, 0x10, 0x2823);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2839
		e1e_wphy(hw, 0x11, 0x0003);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2840
		e1e_wphy(hw, 22, phy_data);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2841
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2842
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2843
	/* Setup buffer sizes */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2844
	rctl &= ~E1000_RCTL_SZ_4096;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2845
	rctl |= E1000_RCTL_BSEX;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2846
	switch (adapter->rx_buffer_len) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2847
	case 2048:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2848
	default:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2849
		rctl |= E1000_RCTL_SZ_2048;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2850
		rctl &= ~E1000_RCTL_BSEX;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2851
		break;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2852
	case 4096:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2853
		rctl |= E1000_RCTL_SZ_4096;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2854
		break;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2855
	case 8192:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2856
		rctl |= E1000_RCTL_SZ_8192;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2857
		break;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2858
	case 16384:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2859
		rctl |= E1000_RCTL_SZ_16384;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2860
		break;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2861
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2862
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2863
	/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2864
	 * 82571 and greater support packet-split where the protocol
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2865
	 * header is placed in skb->data and the packet data is
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2866
	 * placed in pages hanging off of skb_shinfo(skb)->nr_frags.
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2867
	 * In the case of a non-split, skb->data is linearly filled,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2868
	 * followed by the page buffers.  Therefore, skb->data is
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2869
	 * sized to hold the largest protocol header.
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2870
	 *
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2871
	 * allocations using alloc_page take too long for regular MTU
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2872
	 * so only enable packet split for jumbo frames
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2873
	 *
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2874
	 * Using pages when the page size is greater than 16k wastes
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2875
	 * a lot of memory, since we allocate 3 pages at all times
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2876
	 * per packet.
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2877
	 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2878
	pages = PAGE_USE_COUNT(adapter->netdev->mtu);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2879
	if (!(adapter->flags & FLAG_HAS_ERT) && (pages <= 3) &&
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2880
	    (PAGE_SIZE <= 16384) && (rctl & E1000_RCTL_LPE))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2881
		adapter->rx_ps_pages = pages;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2882
	else
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2883
		adapter->rx_ps_pages = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2884
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2885
	if (adapter->rx_ps_pages) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2886
		/* Configure extra packet-split registers */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2887
		rfctl = er32(RFCTL);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2888
		rfctl |= E1000_RFCTL_EXTEN;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2889
		/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2890
		 * disable packet split support for IPv6 extension headers,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2891
		 * because some malformed IPv6 headers can hang the Rx
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2892
		 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2893
		rfctl |= (E1000_RFCTL_IPV6_EX_DIS |
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2894
			  E1000_RFCTL_NEW_IPV6_EXT_DIS);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2895
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2896
		ew32(RFCTL, rfctl);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2897
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2898
		/* Enable Packet split descriptors */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2899
		rctl |= E1000_RCTL_DTYP_PS;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2900
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2901
		psrctl |= adapter->rx_ps_bsize0 >>
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2902
			E1000_PSRCTL_BSIZE0_SHIFT;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2903
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2904
		switch (adapter->rx_ps_pages) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2905
		case 3:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2906
			psrctl |= PAGE_SIZE <<
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2907
				E1000_PSRCTL_BSIZE3_SHIFT;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2908
		case 2:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2909
			psrctl |= PAGE_SIZE <<
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2910
				E1000_PSRCTL_BSIZE2_SHIFT;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2911
		case 1:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2912
			psrctl |= PAGE_SIZE >>
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2913
				E1000_PSRCTL_BSIZE1_SHIFT;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2914
			break;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2915
		}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2916
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2917
		ew32(PSRCTL, psrctl);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2918
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2919
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2920
	ew32(RCTL, rctl);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2921
	/* just started the receive unit, no need to restart */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2922
	adapter->flags &= ~FLAG_RX_RESTART_NOW;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2923
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2924
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2925
/**
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2926
 * e1000_configure_rx - Configure Receive Unit after Reset
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2927
 * @adapter: board private structure
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2928
 *
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2929
 * Configure the Rx unit of the MAC after a reset.
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2930
 **/
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2931
static void e1000_configure_rx(struct e1000_adapter *adapter)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2932
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2933
	struct e1000_hw *hw = &adapter->hw;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2934
	struct e1000_ring *rx_ring = adapter->rx_ring;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2935
	u64 rdba;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2936
	u32 rdlen, rctl, rxcsum, ctrl_ext;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2937
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2938
	if (adapter->rx_ps_pages) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2939
		/* this is a 32 byte descriptor */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2940
		rdlen = rx_ring->count *
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2941
			sizeof(union e1000_rx_desc_packet_split);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2942
		adapter->clean_rx = e1000_clean_rx_irq_ps;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2943
		adapter->alloc_rx_buf = e1000_alloc_rx_buffers_ps;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2944
	} else if (adapter->netdev->mtu > ETH_FRAME_LEN + ETH_FCS_LEN) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2945
		rdlen = rx_ring->count * sizeof(struct e1000_rx_desc);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2946
		adapter->clean_rx = e1000_clean_jumbo_rx_irq;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2947
		adapter->alloc_rx_buf = e1000_alloc_jumbo_rx_buffers;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2948
	} else {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2949
		rdlen = rx_ring->count * sizeof(struct e1000_rx_desc);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2950
		adapter->clean_rx = e1000_clean_rx_irq;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2951
		adapter->alloc_rx_buf = e1000_alloc_rx_buffers;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2952
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2953
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2954
	/* disable receives while setting up the descriptors */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2955
	rctl = er32(RCTL);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2956
	ew32(RCTL, rctl & ~E1000_RCTL_EN);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2957
	e1e_flush();
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2958
	msleep(10);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2959
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2960
	if (adapter->flags2 & FLAG2_DMA_BURST) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2961
		/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2962
		 * set the writeback threshold (only takes effect if the RDTR
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2963
		 * is set). set GRAN=1 and write back up to 0x4 worth, and
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2964
		 * enable prefetching of 0x20 rx descriptors
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2965
		 * granularity = 01
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2966
		 * wthresh = 04,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2967
		 * hthresh = 04,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2968
		 * pthresh = 0x20
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2969
		 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2970
		ew32(RXDCTL(0), E1000_RXDCTL_DMA_BURST_ENABLE);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2971
		ew32(RXDCTL(1), E1000_RXDCTL_DMA_BURST_ENABLE);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2972
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2973
		/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2974
		 * override the delay timers for enabling bursting, only if
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2975
		 * the value was not set by the user via module options
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2976
		 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2977
		if (adapter->rx_int_delay == DEFAULT_RDTR)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2978
			adapter->rx_int_delay = BURST_RDTR;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2979
		if (adapter->rx_abs_int_delay == DEFAULT_RADV)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2980
			adapter->rx_abs_int_delay = BURST_RADV;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2981
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2982
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2983
	/* set the Receive Delay Timer Register */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2984
	ew32(RDTR, adapter->rx_int_delay);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2985
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2986
	/* irq moderation */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2987
	ew32(RADV, adapter->rx_abs_int_delay);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2988
	if ((adapter->itr_setting != 0) && (adapter->itr != 0))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2989
		ew32(ITR, 1000000000 / (adapter->itr * 256));
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2990
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2991
	ctrl_ext = er32(CTRL_EXT);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2992
	/* Auto-Mask interrupts upon ICR access */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2993
	ctrl_ext |= E1000_CTRL_EXT_IAME;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2994
	ew32(IAM, 0xffffffff);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2995
	ew32(CTRL_EXT, ctrl_ext);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2996
	e1e_flush();
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2997
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2998
	/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2999
	 * Setup the HW Rx Head and Tail Descriptor Pointers and
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3000
	 * the Base and Length of the Rx Descriptor Ring
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3001
	 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3002
	rdba = rx_ring->dma;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3003
	ew32(RDBAL, (rdba & DMA_BIT_MASK(32)));
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3004
	ew32(RDBAH, (rdba >> 32));
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3005
	ew32(RDLEN, rdlen);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3006
	ew32(RDH, 0);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3007
	ew32(RDT, 0);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3008
	rx_ring->head = E1000_RDH;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3009
	rx_ring->tail = E1000_RDT;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3010
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3011
	/* Enable Receive Checksum Offload for TCP and UDP */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3012
	rxcsum = er32(RXCSUM);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3013
	if (adapter->flags & FLAG_RX_CSUM_ENABLED) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3014
		rxcsum |= E1000_RXCSUM_TUOFL;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3015
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3016
		/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3017
		 * IPv4 payload checksum for UDP fragments must be
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3018
		 * used in conjunction with packet-split.
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3019
		 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3020
		if (adapter->rx_ps_pages)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3021
			rxcsum |= E1000_RXCSUM_IPPCSE;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3022
	} else {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3023
		rxcsum &= ~E1000_RXCSUM_TUOFL;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3024
		/* no need to clear IPPCSE as it defaults to 0 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3025
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3026
	ew32(RXCSUM, rxcsum);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3027
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3028
	/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3029
	 * Enable early receives on supported devices, only takes effect when
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3030
	 * packet size is equal or larger than the specified value (in 8 byte
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3031
	 * units), e.g. using jumbo frames when setting to E1000_ERT_2048
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3032
	 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3033
	if ((adapter->flags & FLAG_HAS_ERT) ||
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3034
	    (adapter->hw.mac.type == e1000_pch2lan)) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3035
		if (adapter->netdev->mtu > ETH_DATA_LEN) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3036
			u32 rxdctl = er32(RXDCTL(0));
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3037
			ew32(RXDCTL(0), rxdctl | 0x3);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3038
			if (adapter->flags & FLAG_HAS_ERT)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3039
				ew32(ERT, E1000_ERT_2048 | (1 << 13));
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3040
			/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3041
			 * With jumbo frames and early-receive enabled,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3042
			 * excessive C-state transition latencies result in
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3043
			 * dropped transactions.
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3044
			 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3045
			pm_qos_update_request(
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3046
				&adapter->netdev->pm_qos_req, 55);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3047
		} else {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3048
			pm_qos_update_request(
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3049
				&adapter->netdev->pm_qos_req,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3050
				PM_QOS_DEFAULT_VALUE);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3051
		}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3052
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3053
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3054
	/* Enable Receives */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3055
	ew32(RCTL, rctl);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3056
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3057
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3058
/**
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3059
 *  e1000_update_mc_addr_list - Update Multicast addresses
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3060
 *  @hw: pointer to the HW structure
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3061
 *  @mc_addr_list: array of multicast addresses to program
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3062
 *  @mc_addr_count: number of multicast addresses to program
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3063
 *
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3064
 *  Updates the Multicast Table Array.
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3065
 *  The caller must have a packed mc_addr_list of multicast addresses.
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3066
 **/
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3067
static void e1000_update_mc_addr_list(struct e1000_hw *hw, u8 *mc_addr_list,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3068
				      u32 mc_addr_count)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3069
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3070
	hw->mac.ops.update_mc_addr_list(hw, mc_addr_list, mc_addr_count);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3071
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3072
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3073
/**
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3074
 * e1000_set_multi - Multicast and Promiscuous mode set
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3075
 * @netdev: network interface device structure
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3076
 *
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3077
 * The set_multi entry point is called whenever the multicast address
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3078
 * list or the network interface flags are updated.  This routine is
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3079
 * responsible for configuring the hardware for proper multicast,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3080
 * promiscuous mode, and all-multi behavior.
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3081
 **/
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3082
static void e1000_set_multi(struct net_device *netdev)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3083
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3084
	struct e1000_adapter *adapter = netdev_priv(netdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3085
	struct e1000_hw *hw = &adapter->hw;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3086
	struct netdev_hw_addr *ha;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3087
	u8  *mta_list;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3088
	u32 rctl;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3089
	int i;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3090
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3091
	/* Check for Promiscuous and All Multicast modes */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3092
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3093
	rctl = er32(RCTL);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3094
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3095
	if (netdev->flags & IFF_PROMISC) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3096
		rctl |= (E1000_RCTL_UPE | E1000_RCTL_MPE);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3097
		rctl &= ~E1000_RCTL_VFE;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3098
	} else {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3099
		if (netdev->flags & IFF_ALLMULTI) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3100
			rctl |= E1000_RCTL_MPE;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3101
			rctl &= ~E1000_RCTL_UPE;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3102
		} else {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3103
			rctl &= ~(E1000_RCTL_UPE | E1000_RCTL_MPE);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3104
		}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3105
		if (adapter->flags & FLAG_HAS_HW_VLAN_FILTER)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3106
			rctl |= E1000_RCTL_VFE;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3107
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3108
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3109
	ew32(RCTL, rctl);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3110
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3111
	if (!netdev_mc_empty(netdev)) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3112
		mta_list = kmalloc(netdev_mc_count(netdev) * 6, GFP_ATOMIC);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3113
		if (!mta_list)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3114
			return;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3115
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3116
		/* prepare a packed array of only addresses. */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3117
		i = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3118
		netdev_for_each_mc_addr(ha, netdev)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3119
			memcpy(mta_list + (i++ * ETH_ALEN), ha->addr, ETH_ALEN);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3120
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3121
		e1000_update_mc_addr_list(hw, mta_list, i);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3122
		kfree(mta_list);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3123
	} else {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3124
		/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3125
		 * if we're called from probe, we might not have
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3126
		 * anything to do here, so clear out the list
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3127
		 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3128
		e1000_update_mc_addr_list(hw, NULL, 0);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3129
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3130
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3131
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3132
/**
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3133
 * e1000_configure - configure the hardware for Rx and Tx
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3134
 * @adapter: private board structure
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3135
 **/
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3136
static void e1000_configure(struct e1000_adapter *adapter)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3137
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3138
	e1000_set_multi(adapter->netdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3139
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3140
	e1000_restore_vlan(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3141
	e1000_init_manageability_pt(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3142
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3143
	e1000_configure_tx(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3144
	e1000_setup_rctl(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3145
	e1000_configure_rx(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3146
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3147
	if (adapter->ecdev) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3148
		adapter->alloc_rx_buf(adapter, adapter->rx_ring->count);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3149
	} else {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3150
		adapter->alloc_rx_buf(adapter, e1000_desc_unused(adapter->rx_ring));
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3151
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3152
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3153
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3154
/**
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3155
 * e1000e_power_up_phy - restore link in case the phy was powered down
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3156
 * @adapter: address of board private structure
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3157
 *
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3158
 * The phy may be powered down to save power and turn off link when the
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3159
 * driver is unloaded and wake on lan is not enabled (among others)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3160
 * *** this routine MUST be followed by a call to e1000e_reset ***
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3161
 **/
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3162
void e1000e_power_up_phy(struct e1000_adapter *adapter)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3163
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3164
	if (adapter->hw.phy.ops.power_up)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3165
		adapter->hw.phy.ops.power_up(&adapter->hw);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3166
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3167
	adapter->hw.mac.ops.setup_link(&adapter->hw);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3168
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3169
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3170
/**
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3171
 * e1000_power_down_phy - Power down the PHY
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3172
 *
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3173
 * Power down the PHY so no link is implied when interface is down.
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3174
 * The PHY cannot be powered down if management or WoL is active.
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3175
 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3176
static void e1000_power_down_phy(struct e1000_adapter *adapter)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3177
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3178
	/* WoL is enabled */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3179
	if (adapter->wol)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3180
		return;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3181
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3182
	if (adapter->hw.phy.ops.power_down)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3183
		adapter->hw.phy.ops.power_down(&adapter->hw);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3184
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3185
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3186
/**
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3187
 * e1000e_reset - bring the hardware into a known good state
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3188
 *
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3189
 * This function boots the hardware and enables some settings that
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3190
 * require a configuration cycle of the hardware - those cannot be
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3191
 * set/changed during runtime. After reset the device needs to be
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3192
 * properly configured for Rx, Tx etc.
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3193
 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3194
void e1000e_reset(struct e1000_adapter *adapter)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3195
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3196
	struct e1000_mac_info *mac = &adapter->hw.mac;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3197
	struct e1000_fc_info *fc = &adapter->hw.fc;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3198
	struct e1000_hw *hw = &adapter->hw;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3199
	u32 tx_space, min_tx_space, min_rx_space;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3200
	u32 pba = adapter->pba;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3201
	u16 hwm;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3202
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3203
	/* reset Packet Buffer Allocation to default */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3204
	ew32(PBA, pba);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3205
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3206
	if (adapter->max_frame_size > ETH_FRAME_LEN + ETH_FCS_LEN) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3207
		/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3208
		 * To maintain wire speed transmits, the Tx FIFO should be
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3209
		 * large enough to accommodate two full transmit packets,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3210
		 * rounded up to the next 1KB and expressed in KB.  Likewise,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3211
		 * the Rx FIFO should be large enough to accommodate at least
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3212
		 * one full receive packet and is similarly rounded up and
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3213
		 * expressed in KB.
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3214
		 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3215
		pba = er32(PBA);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3216
		/* upper 16 bits has Tx packet buffer allocation size in KB */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3217
		tx_space = pba >> 16;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3218
		/* lower 16 bits has Rx packet buffer allocation size in KB */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3219
		pba &= 0xffff;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3220
		/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3221
		 * the Tx fifo also stores 16 bytes of information about the tx
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3222
		 * but don't include ethernet FCS because hardware appends it
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3223
		 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3224
		min_tx_space = (adapter->max_frame_size +
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3225
				sizeof(struct e1000_tx_desc) -
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3226
				ETH_FCS_LEN) * 2;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3227
		min_tx_space = ALIGN(min_tx_space, 1024);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3228
		min_tx_space >>= 10;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3229
		/* software strips receive CRC, so leave room for it */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3230
		min_rx_space = adapter->max_frame_size;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3231
		min_rx_space = ALIGN(min_rx_space, 1024);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3232
		min_rx_space >>= 10;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3233
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3234
		/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3235
		 * If current Tx allocation is less than the min Tx FIFO size,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3236
		 * and the min Tx FIFO size is less than the current Rx FIFO
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3237
		 * allocation, take space away from current Rx allocation
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3238
		 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3239
		if ((tx_space < min_tx_space) &&
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3240
		    ((min_tx_space - tx_space) < pba)) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3241
			pba -= min_tx_space - tx_space;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3242
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3243
			/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3244
			 * if short on Rx space, Rx wins and must trump tx
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3245
			 * adjustment or use Early Receive if available
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3246
			 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3247
			if ((pba < min_rx_space) &&
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3248
			    (!(adapter->flags & FLAG_HAS_ERT)))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3249
				/* ERT enabled in e1000_configure_rx */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3250
				pba = min_rx_space;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3251
		}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3252
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3253
		ew32(PBA, pba);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3254
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3255
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3256
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3257
	/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3258
	 * flow control settings
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3259
	 *
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3260
	 * The high water mark must be low enough to fit one full frame
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3261
	 * (or the size used for early receive) above it in the Rx FIFO.
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3262
	 * Set it to the lower of:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3263
	 * - 90% of the Rx FIFO size, and
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3264
	 * - the full Rx FIFO size minus the early receive size (for parts
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3265
	 *   with ERT support assuming ERT set to E1000_ERT_2048), or
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3266
	 * - the full Rx FIFO size minus one full frame
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3267
	 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3268
	if (adapter->flags & FLAG_DISABLE_FC_PAUSE_TIME)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3269
		fc->pause_time = 0xFFFF;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3270
	else
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3271
		fc->pause_time = E1000_FC_PAUSE_TIME;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3272
	fc->send_xon = 1;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3273
	fc->current_mode = fc->requested_mode;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3274
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3275
	switch (hw->mac.type) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3276
	default:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3277
		if ((adapter->flags & FLAG_HAS_ERT) &&
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3278
		    (adapter->netdev->mtu > ETH_DATA_LEN))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3279
			hwm = min(((pba << 10) * 9 / 10),
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3280
				  ((pba << 10) - (E1000_ERT_2048 << 3)));
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3281
		else
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3282
			hwm = min(((pba << 10) * 9 / 10),
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3283
				  ((pba << 10) - adapter->max_frame_size));
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3284
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3285
		fc->high_water = hwm & E1000_FCRTH_RTH; /* 8-byte granularity */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3286
		fc->low_water = fc->high_water - 8;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3287
		break;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3288
	case e1000_pchlan:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3289
		/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3290
		 * Workaround PCH LOM adapter hangs with certain network
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3291
		 * loads.  If hangs persist, try disabling Tx flow control.
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3292
		 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3293
		if (adapter->netdev->mtu > ETH_DATA_LEN) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3294
			fc->high_water = 0x3500;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3295
			fc->low_water  = 0x1500;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3296
		} else {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3297
			fc->high_water = 0x5000;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3298
			fc->low_water  = 0x3000;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3299
		}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3300
		fc->refresh_time = 0x1000;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3301
		break;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3302
	case e1000_pch2lan:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3303
		fc->high_water = 0x05C20;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3304
		fc->low_water = 0x05048;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3305
		fc->pause_time = 0x0650;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3306
		fc->refresh_time = 0x0400;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3307
		if (adapter->netdev->mtu > ETH_DATA_LEN) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3308
			pba = 14;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3309
			ew32(PBA, pba);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3310
		}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3311
		break;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3312
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3313
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3314
	/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3315
	 * Disable Adaptive Interrupt Moderation if 2 full packets cannot
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3316
	 * fit in receive buffer and early-receive not supported.
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3317
	 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3318
	if (adapter->itr_setting & 0x3) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3319
		if (((adapter->max_frame_size * 2) > (pba << 10)) &&
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3320
		    !(adapter->flags & FLAG_HAS_ERT)) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3321
			if (!(adapter->flags2 & FLAG2_DISABLE_AIM)) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3322
				dev_info(&adapter->pdev->dev,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3323
					"Interrupt Throttle Rate turned off\n");
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3324
				adapter->flags2 |= FLAG2_DISABLE_AIM;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3325
				ew32(ITR, 0);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3326
			}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3327
		} else if (adapter->flags2 & FLAG2_DISABLE_AIM) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3328
			dev_info(&adapter->pdev->dev,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3329
				 "Interrupt Throttle Rate turned on\n");
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3330
			adapter->flags2 &= ~FLAG2_DISABLE_AIM;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3331
			adapter->itr = 20000;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3332
			ew32(ITR, 1000000000 / (adapter->itr * 256));
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3333
		}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3334
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3335
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3336
	/* Allow time for pending master requests to run */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3337
	mac->ops.reset_hw(hw);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3338
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3339
	/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3340
	 * For parts with AMT enabled, let the firmware know
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3341
	 * that the network interface is in control
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3342
	 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3343
	if (adapter->flags & FLAG_HAS_AMT)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3344
		e1000_get_hw_control(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3345
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3346
	ew32(WUC, 0);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3347
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3348
	if (mac->ops.init_hw(hw))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3349
		e_err("Hardware Error\n");
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3350
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3351
	e1000_update_mng_vlan(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3352
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3353
	/* Enable h/w to recognize an 802.1Q VLAN Ethernet packet */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3354
	ew32(VET, ETH_P_8021Q);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3355
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3356
	e1000e_reset_adaptive(hw);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3357
	e1000_get_phy_info(hw);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3358
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3359
	if ((adapter->flags & FLAG_HAS_SMART_POWER_DOWN) &&
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3360
	    !(adapter->flags & FLAG_SMART_POWER_DOWN)) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3361
		u16 phy_data = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3362
		/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3363
		 * speed up time to link by disabling smart power down, ignore
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3364
		 * the return value of this function because there is nothing
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3365
		 * different we would do if it failed
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3366
		 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3367
		e1e_rphy(hw, IGP02E1000_PHY_POWER_MGMT, &phy_data);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3368
		phy_data &= ~IGP02E1000_PM_SPD;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3369
		e1e_wphy(hw, IGP02E1000_PHY_POWER_MGMT, phy_data);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3370
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3371
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3372
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3373
int e1000e_up(struct e1000_adapter *adapter)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3374
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3375
	struct e1000_hw *hw = &adapter->hw;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3376
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3377
	/* hardware has been reset, we need to reload some things */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3378
	e1000_configure(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3379
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3380
	clear_bit(__E1000_DOWN, &adapter->state);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3381
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3382
	if (!adapter->ecdev) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3383
		napi_enable(&adapter->napi);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3384
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3385
	if (adapter->msix_entries)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3386
		e1000_configure_msix(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3387
	if (!adapter->ecdev) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3388
		e1000_irq_enable(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3389
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3390
		netif_wake_queue(adapter->netdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3391
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3392
		/* fire a link change interrupt to start the watchdog */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3393
		if (adapter->msix_entries)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3394
			ew32(ICS, E1000_ICS_LSC | E1000_ICR_OTHER);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3395
		else
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3396
			ew32(ICS, E1000_ICS_LSC);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3397
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3398
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3399
	return 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3400
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3401
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3402
void e1000e_down(struct e1000_adapter *adapter)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3403
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3404
	struct net_device *netdev = adapter->netdev;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3405
	struct e1000_hw *hw = &adapter->hw;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3406
	u32 tctl, rctl;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3407
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3408
	/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3409
	 * signal that we're down so the interrupt handler does not
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3410
	 * reschedule our watchdog timer
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3411
	 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3412
	set_bit(__E1000_DOWN, &adapter->state);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3413
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3414
	/* disable receives in the hardware */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3415
	rctl = er32(RCTL);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3416
	ew32(RCTL, rctl & ~E1000_RCTL_EN);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3417
	/* flush and sleep below */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3418
2421
bc2d4bf9cbe5 Removed trailing spaces.
Florian Pose <fp@igh-essen.com>
parents: 2234
diff changeset
  3419
	if (!adapter->ecdev)
2219
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3420
		netif_stop_queue(netdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3421
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3422
	/* disable transmits in the hardware */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3423
	tctl = er32(TCTL);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3424
	tctl &= ~E1000_TCTL_EN;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3425
	ew32(TCTL, tctl);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3426
	/* flush both disables and wait for them to finish */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3427
	e1e_flush();
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3428
	msleep(10);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3429
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3430
	if (!adapter->ecdev) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3431
		napi_disable(&adapter->napi);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3432
		e1000_irq_disable(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3433
		del_timer_sync(&adapter->watchdog_timer);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3434
		del_timer_sync(&adapter->phy_info_timer);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3435
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3436
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3437
	if (adapter->ecdev) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3438
		ecdev_set_link(adapter->ecdev, 0);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3439
	} else {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3440
		netif_carrier_off(netdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3441
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3442
	adapter->link_speed = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3443
	adapter->link_duplex = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3444
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3445
	if (!pci_channel_offline(adapter->pdev))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3446
		e1000e_reset(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3447
	e1000_clean_tx_ring(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3448
	e1000_clean_rx_ring(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3449
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3450
	/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3451
	 * TODO: for power management, we could drop the link and
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3452
	 * pci_disable_device here.
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3453
	 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3454
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3455
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3456
void e1000e_reinit_locked(struct e1000_adapter *adapter)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3457
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3458
	might_sleep();
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3459
	while (test_and_set_bit(__E1000_RESETTING, &adapter->state))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3460
		msleep(1);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3461
	e1000e_down(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3462
	e1000e_up(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3463
	clear_bit(__E1000_RESETTING, &adapter->state);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3464
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3465
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3466
/**
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3467
 * e1000_sw_init - Initialize general software structures (struct e1000_adapter)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3468
 * @adapter: board private structure to initialize
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3469
 *
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3470
 * e1000_sw_init initializes the Adapter private data structure.
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3471
 * Fields are initialized based on PCI device information and
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3472
 * OS network device settings (MTU size).
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3473
 **/
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3474
static int __devinit e1000_sw_init(struct e1000_adapter *adapter)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3475
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3476
	struct net_device *netdev = adapter->netdev;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3477
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3478
	adapter->rx_buffer_len = ETH_FRAME_LEN + VLAN_HLEN + ETH_FCS_LEN;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3479
	adapter->rx_ps_bsize0 = 128;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3480
	adapter->max_frame_size = netdev->mtu + ETH_HLEN + ETH_FCS_LEN;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3481
	adapter->min_frame_size = ETH_ZLEN + ETH_FCS_LEN;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3482
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3483
	e1000e_set_interrupt_capability(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3484
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3485
	if (e1000_alloc_queues(adapter))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3486
		return -ENOMEM;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3487
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3488
	/* Explicitly disable IRQ since the NIC can be in any state. */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3489
	e1000_irq_disable(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3490
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3491
	set_bit(__E1000_DOWN, &adapter->state);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3492
	return 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3493
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3494
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3495
/**
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3496
 * e1000_intr_msi_test - Interrupt Handler
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3497
 * @irq: interrupt number
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3498
 * @data: pointer to a network interface device structure
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3499
 **/
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3500
static irqreturn_t e1000_intr_msi_test(int irq, void *data)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3501
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3502
	struct net_device *netdev = data;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3503
	struct e1000_adapter *adapter = netdev_priv(netdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3504
	struct e1000_hw *hw = &adapter->hw;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3505
	u32 icr = er32(ICR);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3506
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3507
	e_dbg("icr is %08X\n", icr);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3508
	if (icr & E1000_ICR_RXSEQ) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3509
		adapter->flags &= ~FLAG_MSI_TEST_FAILED;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3510
		wmb();
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3511
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3512
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3513
	return IRQ_HANDLED;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3514
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3515
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3516
/**
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3517
 * e1000_test_msi_interrupt - Returns 0 for successful test
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3518
 * @adapter: board private struct
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3519
 *
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3520
 * code flow taken from tg3.c
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3521
 **/
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3522
static int e1000_test_msi_interrupt(struct e1000_adapter *adapter)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3523
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3524
	struct net_device *netdev = adapter->netdev;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3525
	struct e1000_hw *hw = &adapter->hw;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3526
	int err;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3527
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3528
	/* poll_enable hasn't been called yet, so don't need disable */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3529
	/* clear any pending events */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3530
	er32(ICR);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3531
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3532
	/* free the real vector and request a test handler */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3533
	e1000_free_irq(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3534
	e1000e_reset_interrupt_capability(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3535
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3536
	/* Assume that the test fails, if it succeeds then the test
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3537
	 * MSI irq handler will unset this flag */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3538
	adapter->flags |= FLAG_MSI_TEST_FAILED;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3539
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3540
	err = pci_enable_msi(adapter->pdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3541
	if (err)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3542
		goto msi_test_failed;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3543
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3544
	err = request_irq(adapter->pdev->irq, e1000_intr_msi_test, 0,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3545
			  netdev->name, netdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3546
	if (err) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3547
		pci_disable_msi(adapter->pdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3548
		goto msi_test_failed;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3549
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3550
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3551
	wmb();
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3552
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3553
	e1000_irq_enable(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3554
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3555
	/* fire an unusual interrupt on the test handler */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3556
	ew32(ICS, E1000_ICS_RXSEQ);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3557
	e1e_flush();
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3558
	msleep(50);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3559
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3560
	e1000_irq_disable(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3561
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3562
	rmb();
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3563
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3564
	if (adapter->flags & FLAG_MSI_TEST_FAILED) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3565
		adapter->int_mode = E1000E_INT_MODE_LEGACY;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3566
		e_info("MSI interrupt test failed, using legacy interrupt.\n");
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3567
	} else
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3568
		e_dbg("MSI interrupt test succeeded!\n");
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3569
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3570
	free_irq(adapter->pdev->irq, netdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3571
	pci_disable_msi(adapter->pdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3572
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3573
msi_test_failed:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3574
	e1000e_set_interrupt_capability(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3575
	return e1000_request_irq(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3576
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3577
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3578
/**
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3579
 * e1000_test_msi - Returns 0 if MSI test succeeds or INTx mode is restored
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3580
 * @adapter: board private struct
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3581
 *
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3582
 * code flow taken from tg3.c, called with e1000 interrupts disabled.
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3583
 **/
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3584
static int e1000_test_msi(struct e1000_adapter *adapter)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3585
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3586
	int err;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3587
	u16 pci_cmd;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3588
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3589
	if (!(adapter->flags & FLAG_MSI_ENABLED))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3590
		return 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3591
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3592
	/* disable SERR in case the MSI write causes a master abort */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3593
	pci_read_config_word(adapter->pdev, PCI_COMMAND, &pci_cmd);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3594
	if (pci_cmd & PCI_COMMAND_SERR)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3595
		pci_write_config_word(adapter->pdev, PCI_COMMAND,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3596
				      pci_cmd & ~PCI_COMMAND_SERR);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3597
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3598
	err = e1000_test_msi_interrupt(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3599
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3600
	/* re-enable SERR */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3601
	if (pci_cmd & PCI_COMMAND_SERR) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3602
		pci_read_config_word(adapter->pdev, PCI_COMMAND, &pci_cmd);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3603
		pci_cmd |= PCI_COMMAND_SERR;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3604
		pci_write_config_word(adapter->pdev, PCI_COMMAND, pci_cmd);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3605
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3606
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3607
	return err;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3608
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3609
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3610
/**
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3611
 * e1000_open - Called when a network interface is made active
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3612
 * @netdev: network interface device structure
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3613
 *
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3614
 * Returns 0 on success, negative value on failure
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3615
 *
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3616
 * The open entry point is called when a network interface is made
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3617
 * active by the system (IFF_UP).  At this point all resources needed
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3618
 * for transmit and receive operations are allocated, the interrupt
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3619
 * handler is registered with the OS, the watchdog timer is started,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3620
 * and the stack is notified that the interface is ready.
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3621
 **/
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3622
static int e1000_open(struct net_device *netdev)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3623
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3624
	struct e1000_adapter *adapter = netdev_priv(netdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3625
	struct e1000_hw *hw = &adapter->hw;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3626
	struct pci_dev *pdev = adapter->pdev;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3627
	int err;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3628
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3629
	/* disallow open during test */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3630
	if (test_bit(__E1000_TESTING, &adapter->state))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3631
		return -EBUSY;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3632
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3633
	pm_runtime_get_sync(&pdev->dev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3634
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3635
	if (adapter->ecdev) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3636
		ecdev_set_link(adapter->ecdev, 0);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3637
	} else {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3638
		netif_carrier_off(netdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3639
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3640
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3641
	/* allocate transmit descriptors */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3642
	err = e1000e_setup_tx_resources(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3643
	if (err)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3644
		goto err_setup_tx;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3645
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3646
	/* allocate receive descriptors */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3647
	err = e1000e_setup_rx_resources(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3648
	if (err)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3649
		goto err_setup_rx;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3650
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3651
	/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3652
	 * If AMT is enabled, let the firmware know that the network
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3653
	 * interface is now open and reset the part to a known state.
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3654
	 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3655
	if (adapter->flags & FLAG_HAS_AMT) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3656
		e1000_get_hw_control(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3657
		e1000e_reset(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3658
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3659
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3660
	e1000e_power_up_phy(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3661
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3662
	adapter->mng_vlan_id = E1000_MNG_VLAN_NONE;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3663
	if ((adapter->hw.mng_cookie.status &
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3664
	     E1000_MNG_DHCP_COOKIE_STATUS_VLAN))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3665
		e1000_update_mng_vlan(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3666
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3667
	/* DMA latency requirement to workaround early-receive/jumbo issue */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3668
	if ((adapter->flags & FLAG_HAS_ERT) ||
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3669
	    (adapter->hw.mac.type == e1000_pch2lan))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3670
		pm_qos_add_request(&adapter->netdev->pm_qos_req,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3671
				   PM_QOS_CPU_DMA_LATENCY,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3672
				   PM_QOS_DEFAULT_VALUE);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3673
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3674
	/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3675
	 * before we allocate an interrupt, we must be ready to handle it.
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3676
	 * Setting DEBUG_SHIRQ in the kernel makes it fire an interrupt
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3677
	 * as soon as we call pci_request_irq, so we have to setup our
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3678
	 * clean_rx handler before we do so.
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3679
	 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3680
	e1000_configure(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3681
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3682
	err = e1000_request_irq(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3683
	if (err)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3684
		goto err_req_irq;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3685
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3686
	/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3687
	 * Work around PCIe errata with MSI interrupts causing some chipsets to
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3688
	 * ignore e1000e MSI messages, which means we need to test our MSI
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3689
	 * interrupt now
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3690
	 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3691
	if (adapter->int_mode != E1000E_INT_MODE_LEGACY) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3692
		err = e1000_test_msi(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3693
		if (err) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3694
			e_err("Interrupt allocation failed\n");
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3695
			goto err_req_irq;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3696
		}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3697
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3698
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3699
	/* From here on the code is the same as e1000e_up() */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3700
	clear_bit(__E1000_DOWN, &adapter->state);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3701
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3702
	if (!adapter->ecdev) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3703
		napi_enable(&adapter->napi);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3704
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3705
		e1000_irq_enable(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3706
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3707
		netif_start_queue(netdev);
2473
f62b64fdbc23 Fixed e1000_open() in e1000e drivers.
Florian Pose <fp@igh-essen.com>
parents: 2472
diff changeset
  3708
	}
f62b64fdbc23 Fixed e1000_open() in e1000e drivers.
Florian Pose <fp@igh-essen.com>
parents: 2472
diff changeset
  3709
f62b64fdbc23 Fixed e1000_open() in e1000e drivers.
Florian Pose <fp@igh-essen.com>
parents: 2472
diff changeset
  3710
	adapter->idle_check = true;
f62b64fdbc23 Fixed e1000_open() in e1000e drivers.
Florian Pose <fp@igh-essen.com>
parents: 2472
diff changeset
  3711
	pm_runtime_put(&pdev->dev);
f62b64fdbc23 Fixed e1000_open() in e1000e drivers.
Florian Pose <fp@igh-essen.com>
parents: 2472
diff changeset
  3712
f62b64fdbc23 Fixed e1000_open() in e1000e drivers.
Florian Pose <fp@igh-essen.com>
parents: 2472
diff changeset
  3713
	/* fire a link status change interrupt to start the watchdog */
f62b64fdbc23 Fixed e1000_open() in e1000e drivers.
Florian Pose <fp@igh-essen.com>
parents: 2472
diff changeset
  3714
	if (adapter->msix_entries)
f62b64fdbc23 Fixed e1000_open() in e1000e drivers.
Florian Pose <fp@igh-essen.com>
parents: 2472
diff changeset
  3715
		ew32(ICS, E1000_ICS_LSC | E1000_ICR_OTHER);
f62b64fdbc23 Fixed e1000_open() in e1000e drivers.
Florian Pose <fp@igh-essen.com>
parents: 2472
diff changeset
  3716
	else
f62b64fdbc23 Fixed e1000_open() in e1000e drivers.
Florian Pose <fp@igh-essen.com>
parents: 2472
diff changeset
  3717
		ew32(ICS, E1000_ICS_LSC);
2219
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3718
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3719
	return 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3720
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3721
err_req_irq:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3722
	e1000_release_hw_control(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3723
	e1000_power_down_phy(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3724
	e1000e_free_rx_resources(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3725
err_setup_rx:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3726
	e1000e_free_tx_resources(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3727
err_setup_tx:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3728
	e1000e_reset(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3729
	pm_runtime_put_sync(&pdev->dev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3730
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3731
	return err;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3732
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3733
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3734
/**
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3735
 * e1000_close - Disables a network interface
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3736
 * @netdev: network interface device structure
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3737
 *
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3738
 * Returns 0, this is not allowed to fail
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3739
 *
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3740
 * The close entry point is called when an interface is de-activated
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3741
 * by the OS.  The hardware is still under the drivers control, but
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3742
 * needs to be disabled.  A global MAC reset is issued to stop the
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3743
 * hardware, and all transmit and receive resources are freed.
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3744
 **/
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3745
static int e1000_close(struct net_device *netdev)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3746
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3747
	struct e1000_adapter *adapter = netdev_priv(netdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3748
	struct pci_dev *pdev = adapter->pdev;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3749
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3750
	WARN_ON(test_bit(__E1000_RESETTING, &adapter->state));
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3751
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3752
	pm_runtime_get_sync(&pdev->dev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3753
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3754
	if (!test_bit(__E1000_DOWN, &adapter->state)) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3755
		e1000e_down(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3756
		e1000_free_irq(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3757
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3758
	e1000_power_down_phy(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3759
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3760
	e1000e_free_tx_resources(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3761
	e1000e_free_rx_resources(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3762
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3763
	/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3764
	 * kill manageability vlan ID if supported, but not if a vlan with
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3765
	 * the same ID is registered on the host OS (let 8021q kill it)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3766
	 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3767
	if ((adapter->hw.mng_cookie.status &
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3768
			  E1000_MNG_DHCP_COOKIE_STATUS_VLAN) &&
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3769
	     !(adapter->vlgrp &&
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3770
	       vlan_group_get_device(adapter->vlgrp, adapter->mng_vlan_id)))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3771
		e1000_vlan_rx_kill_vid(netdev, adapter->mng_vlan_id);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3772
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3773
	/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3774
	 * If AMT is enabled, let the firmware know that the network
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3775
	 * interface is now closed
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3776
	 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3777
	if (adapter->flags & FLAG_HAS_AMT)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3778
		e1000_release_hw_control(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3779
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3780
	if ((adapter->flags & FLAG_HAS_ERT) ||
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3781
	    (adapter->hw.mac.type == e1000_pch2lan))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3782
		pm_qos_remove_request(&adapter->netdev->pm_qos_req);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3783
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3784
	pm_runtime_put_sync(&pdev->dev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3785
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3786
	return 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3787
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3788
/**
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3789
 * e1000_set_mac - Change the Ethernet Address of the NIC
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3790
 * @netdev: network interface device structure
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3791
 * @p: pointer to an address structure
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3792
 *
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3793
 * Returns 0 on success, negative on failure
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3794
 **/
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3795
static int e1000_set_mac(struct net_device *netdev, void *p)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3796
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3797
	struct e1000_adapter *adapter = netdev_priv(netdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3798
	struct sockaddr *addr = p;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3799
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3800
	if (!is_valid_ether_addr(addr->sa_data))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3801
		return -EADDRNOTAVAIL;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3802
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3803
	memcpy(netdev->dev_addr, addr->sa_data, netdev->addr_len);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3804
	memcpy(adapter->hw.mac.addr, addr->sa_data, netdev->addr_len);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3805
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3806
	e1000e_rar_set(&adapter->hw, adapter->hw.mac.addr, 0);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3807
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3808
	if (adapter->flags & FLAG_RESET_OVERWRITES_LAA) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3809
		/* activate the work around */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3810
		e1000e_set_laa_state_82571(&adapter->hw, 1);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3811
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3812
		/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3813
		 * Hold a copy of the LAA in RAR[14] This is done so that
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3814
		 * between the time RAR[0] gets clobbered  and the time it
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3815
		 * gets fixed (in e1000_watchdog), the actual LAA is in one
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3816
		 * of the RARs and no incoming packets directed to this port
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3817
		 * are dropped. Eventually the LAA will be in RAR[0] and
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3818
		 * RAR[14]
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3819
		 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3820
		e1000e_rar_set(&adapter->hw,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3821
			      adapter->hw.mac.addr,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3822
			      adapter->hw.mac.rar_entry_count - 1);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3823
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3824
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3825
	return 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3826
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3827
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3828
/**
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3829
 * e1000e_update_phy_task - work thread to update phy
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3830
 * @work: pointer to our work struct
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3831
 *
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3832
 * this worker thread exists because we must acquire a
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3833
 * semaphore to read the phy, which we could msleep while
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3834
 * waiting for it, and we can't msleep in a timer.
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3835
 **/
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3836
static void e1000e_update_phy_task(struct work_struct *work)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3837
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3838
	struct e1000_adapter *adapter = container_of(work,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3839
					struct e1000_adapter, update_phy_task);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3840
	e1000_get_phy_info(&adapter->hw);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3841
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3842
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3843
/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3844
 * Need to wait a few seconds after link up to get diagnostic information from
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3845
 * the phy
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3846
 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3847
static void e1000_update_phy_info(unsigned long data)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3848
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3849
	struct e1000_adapter *adapter = (struct e1000_adapter *) data;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3850
	schedule_work(&adapter->update_phy_task);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3851
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3852
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3853
/**
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3854
 * e1000e_update_phy_stats - Update the PHY statistics counters
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3855
 * @adapter: board private structure
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3856
 **/
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3857
static void e1000e_update_phy_stats(struct e1000_adapter *adapter)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3858
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3859
	struct e1000_hw *hw = &adapter->hw;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3860
	s32 ret_val;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3861
	u16 phy_data;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3862
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3863
	ret_val = hw->phy.ops.acquire(hw);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3864
	if (ret_val)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3865
		return;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3866
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3867
	hw->phy.addr = 1;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3868
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3869
#define HV_PHY_STATS_PAGE	778
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3870
	/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3871
	 * A page set is expensive so check if already on desired page.
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3872
	 * If not, set to the page with the PHY status registers.
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3873
	 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3874
	ret_val = e1000e_read_phy_reg_mdic(hw, IGP01E1000_PHY_PAGE_SELECT,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3875
					   &phy_data);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3876
	if (ret_val)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3877
		goto release;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3878
	if (phy_data != (HV_PHY_STATS_PAGE << IGP_PAGE_SHIFT)) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3879
		ret_val = e1000e_write_phy_reg_mdic(hw,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3880
						    IGP01E1000_PHY_PAGE_SELECT,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3881
						    (HV_PHY_STATS_PAGE <<
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3882
						     IGP_PAGE_SHIFT));
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3883
		if (ret_val)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3884
			goto release;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3885
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3886
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3887
	/* Read/clear the upper 16-bit registers and read/accumulate lower */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3888
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3889
	/* Single Collision Count */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3890
	e1000e_read_phy_reg_mdic(hw, HV_SCC_UPPER & MAX_PHY_REG_ADDRESS,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3891
				 &phy_data);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3892
	ret_val = e1000e_read_phy_reg_mdic(hw,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3893
					   HV_SCC_LOWER & MAX_PHY_REG_ADDRESS,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3894
					   &phy_data);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3895
	if (!ret_val)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3896
		adapter->stats.scc += phy_data;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3897
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3898
	/* Excessive Collision Count */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3899
	e1000e_read_phy_reg_mdic(hw, HV_ECOL_UPPER & MAX_PHY_REG_ADDRESS,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3900
				 &phy_data);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3901
	ret_val = e1000e_read_phy_reg_mdic(hw,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3902
					   HV_ECOL_LOWER & MAX_PHY_REG_ADDRESS,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3903
					   &phy_data);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3904
	if (!ret_val)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3905
		adapter->stats.ecol += phy_data;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3906
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3907
	/* Multiple Collision Count */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3908
	e1000e_read_phy_reg_mdic(hw, HV_MCC_UPPER & MAX_PHY_REG_ADDRESS,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3909
				 &phy_data);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3910
	ret_val = e1000e_read_phy_reg_mdic(hw,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3911
					   HV_MCC_LOWER & MAX_PHY_REG_ADDRESS,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3912
					   &phy_data);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3913
	if (!ret_val)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3914
		adapter->stats.mcc += phy_data;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3915
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3916
	/* Late Collision Count */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3917
	e1000e_read_phy_reg_mdic(hw, HV_LATECOL_UPPER & MAX_PHY_REG_ADDRESS,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3918
				 &phy_data);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3919
	ret_val = e1000e_read_phy_reg_mdic(hw,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3920
					   HV_LATECOL_LOWER &
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3921
					   MAX_PHY_REG_ADDRESS,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3922
					   &phy_data);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3923
	if (!ret_val)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3924
		adapter->stats.latecol += phy_data;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3925
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3926
	/* Collision Count - also used for adaptive IFS */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3927
	e1000e_read_phy_reg_mdic(hw, HV_COLC_UPPER & MAX_PHY_REG_ADDRESS,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3928
				 &phy_data);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3929
	ret_val = e1000e_read_phy_reg_mdic(hw,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3930
					   HV_COLC_LOWER & MAX_PHY_REG_ADDRESS,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3931
					   &phy_data);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3932
	if (!ret_val)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3933
		hw->mac.collision_delta = phy_data;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3934
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3935
	/* Defer Count */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3936
	e1000e_read_phy_reg_mdic(hw, HV_DC_UPPER & MAX_PHY_REG_ADDRESS,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3937
				 &phy_data);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3938
	ret_val = e1000e_read_phy_reg_mdic(hw,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3939
					   HV_DC_LOWER & MAX_PHY_REG_ADDRESS,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3940
					   &phy_data);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3941
	if (!ret_val)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3942
		adapter->stats.dc += phy_data;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3943
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3944
	/* Transmit with no CRS */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3945
	e1000e_read_phy_reg_mdic(hw, HV_TNCRS_UPPER & MAX_PHY_REG_ADDRESS,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3946
				 &phy_data);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3947
	ret_val = e1000e_read_phy_reg_mdic(hw,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3948
					   HV_TNCRS_LOWER & MAX_PHY_REG_ADDRESS,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3949
					   &phy_data);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3950
	if (!ret_val)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3951
		adapter->stats.tncrs += phy_data;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3952
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3953
release:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3954
	hw->phy.ops.release(hw);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3955
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3956
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3957
/**
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3958
 * e1000e_update_stats - Update the board statistics counters
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3959
 * @adapter: board private structure
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3960
 **/
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3961
void e1000e_update_stats(struct e1000_adapter *adapter)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3962
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3963
	struct net_device *netdev = adapter->netdev;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3964
	struct e1000_hw *hw = &adapter->hw;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3965
	struct pci_dev *pdev = adapter->pdev;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3966
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3967
	/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3968
	 * Prevent stats update while adapter is being reset, or if the pci
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3969
	 * connection is down.
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3970
	 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3971
	if (adapter->link_speed == 0)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3972
		return;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3973
	if (pci_channel_offline(pdev))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3974
		return;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3975
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3976
	adapter->stats.crcerrs += er32(CRCERRS);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3977
	adapter->stats.gprc += er32(GPRC);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3978
	adapter->stats.gorc += er32(GORCL);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3979
	er32(GORCH); /* Clear gorc */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3980
	adapter->stats.bprc += er32(BPRC);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3981
	adapter->stats.mprc += er32(MPRC);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3982
	adapter->stats.roc += er32(ROC);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3983
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3984
	adapter->stats.mpc += er32(MPC);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3985
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3986
	/* Half-duplex statistics */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3987
	if (adapter->link_duplex == HALF_DUPLEX) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3988
		if (adapter->flags2 & FLAG2_HAS_PHY_STATS) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3989
			e1000e_update_phy_stats(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3990
		} else {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3991
			adapter->stats.scc += er32(SCC);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3992
			adapter->stats.ecol += er32(ECOL);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3993
			adapter->stats.mcc += er32(MCC);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3994
			adapter->stats.latecol += er32(LATECOL);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3995
			adapter->stats.dc += er32(DC);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3996
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3997
			hw->mac.collision_delta = er32(COLC);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3998
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3999
			if ((hw->mac.type != e1000_82574) &&
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4000
			    (hw->mac.type != e1000_82583))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4001
				adapter->stats.tncrs += er32(TNCRS);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4002
		}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4003
		adapter->stats.colc += hw->mac.collision_delta;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4004
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4005
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4006
	adapter->stats.xonrxc += er32(XONRXC);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4007
	adapter->stats.xontxc += er32(XONTXC);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4008
	adapter->stats.xoffrxc += er32(XOFFRXC);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4009
	adapter->stats.xofftxc += er32(XOFFTXC);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4010
	adapter->stats.gptc += er32(GPTC);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4011
	adapter->stats.gotc += er32(GOTCL);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4012
	er32(GOTCH); /* Clear gotc */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4013
	adapter->stats.rnbc += er32(RNBC);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4014
	adapter->stats.ruc += er32(RUC);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4015
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4016
	adapter->stats.mptc += er32(MPTC);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4017
	adapter->stats.bptc += er32(BPTC);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4018
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4019
	/* used for adaptive IFS */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4020
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4021
	hw->mac.tx_packet_delta = er32(TPT);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4022
	adapter->stats.tpt += hw->mac.tx_packet_delta;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4023
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4024
	adapter->stats.algnerrc += er32(ALGNERRC);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4025
	adapter->stats.rxerrc += er32(RXERRC);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4026
	adapter->stats.cexterr += er32(CEXTERR);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4027
	adapter->stats.tsctc += er32(TSCTC);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4028
	adapter->stats.tsctfc += er32(TSCTFC);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4029
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4030
	/* Fill out the OS statistics structure */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4031
	netdev->stats.multicast = adapter->stats.mprc;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4032
	netdev->stats.collisions = adapter->stats.colc;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4033
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4034
	/* Rx Errors */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4035
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4036
	/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4037
	 * RLEC on some newer hardware can be incorrect so build
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4038
	 * our own version based on RUC and ROC
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4039
	 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4040
	netdev->stats.rx_errors = adapter->stats.rxerrc +
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4041
		adapter->stats.crcerrs + adapter->stats.algnerrc +
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4042
		adapter->stats.ruc + adapter->stats.roc +
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4043
		adapter->stats.cexterr;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4044
	netdev->stats.rx_length_errors = adapter->stats.ruc +
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4045
					      adapter->stats.roc;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4046
	netdev->stats.rx_crc_errors = adapter->stats.crcerrs;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4047
	netdev->stats.rx_frame_errors = adapter->stats.algnerrc;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4048
	netdev->stats.rx_missed_errors = adapter->stats.mpc;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4049
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4050
	/* Tx Errors */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4051
	netdev->stats.tx_errors = adapter->stats.ecol +
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4052
				       adapter->stats.latecol;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4053
	netdev->stats.tx_aborted_errors = adapter->stats.ecol;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4054
	netdev->stats.tx_window_errors = adapter->stats.latecol;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4055
	netdev->stats.tx_carrier_errors = adapter->stats.tncrs;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4056
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4057
	/* Tx Dropped needs to be maintained elsewhere */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4058
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4059
	/* Management Stats */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4060
	adapter->stats.mgptc += er32(MGTPTC);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4061
	adapter->stats.mgprc += er32(MGTPRC);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4062
	adapter->stats.mgpdc += er32(MGTPDC);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4063
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4064
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4065
/**
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4066
 * e1000_phy_read_status - Update the PHY register status snapshot
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4067
 * @adapter: board private structure
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4068
 **/
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4069
static void e1000_phy_read_status(struct e1000_adapter *adapter)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4070
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4071
	struct e1000_hw *hw = &adapter->hw;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4072
	struct e1000_phy_regs *phy = &adapter->phy_regs;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4073
	int ret_val;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4074
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4075
	if ((er32(STATUS) & E1000_STATUS_LU) &&
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4076
	    (adapter->hw.phy.media_type == e1000_media_type_copper)) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4077
		ret_val  = e1e_rphy(hw, PHY_CONTROL, &phy->bmcr);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4078
		ret_val |= e1e_rphy(hw, PHY_STATUS, &phy->bmsr);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4079
		ret_val |= e1e_rphy(hw, PHY_AUTONEG_ADV, &phy->advertise);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4080
		ret_val |= e1e_rphy(hw, PHY_LP_ABILITY, &phy->lpa);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4081
		ret_val |= e1e_rphy(hw, PHY_AUTONEG_EXP, &phy->expansion);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4082
		ret_val |= e1e_rphy(hw, PHY_1000T_CTRL, &phy->ctrl1000);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4083
		ret_val |= e1e_rphy(hw, PHY_1000T_STATUS, &phy->stat1000);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4084
		ret_val |= e1e_rphy(hw, PHY_EXT_STATUS, &phy->estatus);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4085
		if (ret_val)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4086
			e_warn("Error reading PHY register\n");
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4087
	} else {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4088
		/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4089
		 * Do not read PHY registers if link is not up
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4090
		 * Set values to typical power-on defaults
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4091
		 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4092
		phy->bmcr = (BMCR_SPEED1000 | BMCR_ANENABLE | BMCR_FULLDPLX);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4093
		phy->bmsr = (BMSR_100FULL | BMSR_100HALF | BMSR_10FULL |
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4094
			     BMSR_10HALF | BMSR_ESTATEN | BMSR_ANEGCAPABLE |
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4095
			     BMSR_ERCAP);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4096
		phy->advertise = (ADVERTISE_PAUSE_ASYM | ADVERTISE_PAUSE_CAP |
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4097
				  ADVERTISE_ALL | ADVERTISE_CSMA);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4098
		phy->lpa = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4099
		phy->expansion = EXPANSION_ENABLENPAGE;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4100
		phy->ctrl1000 = ADVERTISE_1000FULL;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4101
		phy->stat1000 = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4102
		phy->estatus = (ESTATUS_1000_TFULL | ESTATUS_1000_THALF);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4103
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4104
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4105
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4106
static void e1000_print_link_info(struct e1000_adapter *adapter)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4107
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4108
	struct e1000_hw *hw = &adapter->hw;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4109
	u32 ctrl = er32(CTRL);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4110
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4111
	/* Link status message must follow this format for user tools */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4112
	printk(KERN_INFO "e1000e: %s NIC Link is Up %d Mbps %s, "
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4113
	       "Flow Control: %s\n",
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4114
	       adapter->netdev->name,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4115
	       adapter->link_speed,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4116
	       (adapter->link_duplex == FULL_DUPLEX) ?
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4117
	                        "Full Duplex" : "Half Duplex",
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4118
	       ((ctrl & E1000_CTRL_TFCE) && (ctrl & E1000_CTRL_RFCE)) ?
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4119
	                        "RX/TX" :
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4120
	       ((ctrl & E1000_CTRL_RFCE) ? "RX" :
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4121
	       ((ctrl & E1000_CTRL_TFCE) ? "TX" : "None" )));
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4122
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4123
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4124
static bool e1000e_has_link(struct e1000_adapter *adapter)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4125
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4126
	struct e1000_hw *hw = &adapter->hw;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4127
	bool link_active = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4128
	s32 ret_val = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4129
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4130
	/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4131
	 * get_link_status is set on LSC (link status) interrupt or
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4132
	 * Rx sequence error interrupt.  get_link_status will stay
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4133
	 * false until the check_for_link establishes link
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4134
	 * for copper adapters ONLY
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4135
	 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4136
	switch (hw->phy.media_type) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4137
	case e1000_media_type_copper:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4138
		if (hw->mac.get_link_status) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4139
			ret_val = hw->mac.ops.check_for_link(hw);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4140
			link_active = !hw->mac.get_link_status;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4141
		} else {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4142
			link_active = 1;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4143
		}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4144
		break;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4145
	case e1000_media_type_fiber:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4146
		ret_val = hw->mac.ops.check_for_link(hw);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4147
		link_active = !!(er32(STATUS) & E1000_STATUS_LU);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4148
		break;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4149
	case e1000_media_type_internal_serdes:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4150
		ret_val = hw->mac.ops.check_for_link(hw);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4151
		link_active = adapter->hw.mac.serdes_has_link;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4152
		break;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4153
	default:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4154
	case e1000_media_type_unknown:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4155
		break;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4156
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4157
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4158
	if ((ret_val == E1000_ERR_PHY) && (hw->phy.type == e1000_phy_igp_3) &&
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4159
	    (er32(CTRL) & E1000_PHY_CTRL_GBE_DISABLE)) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4160
		/* See e1000_kmrn_lock_loss_workaround_ich8lan() */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4161
		e_info("Gigabit has been disabled, downgrading speed\n");
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4162
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4163
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4164
	return link_active;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4165
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4166
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4167
static void e1000e_enable_receives(struct e1000_adapter *adapter)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4168
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4169
	/* make sure the receive unit is started */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4170
	if ((adapter->flags & FLAG_RX_NEEDS_RESTART) &&
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4171
	    (adapter->flags & FLAG_RX_RESTART_NOW)) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4172
		struct e1000_hw *hw = &adapter->hw;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4173
		u32 rctl = er32(RCTL);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4174
		ew32(RCTL, rctl | E1000_RCTL_EN);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4175
		adapter->flags &= ~FLAG_RX_RESTART_NOW;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4176
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4177
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4178
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4179
static void e1000e_check_82574_phy_workaround(struct e1000_adapter *adapter)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4180
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4181
	struct e1000_hw *hw = &adapter->hw;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4182
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4183
	/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4184
	 * With 82574 controllers, PHY needs to be checked periodically
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4185
	 * for hung state and reset, if two calls return true
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4186
	 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4187
	if (e1000_check_phy_82574(hw))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4188
		adapter->phy_hang_count++;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4189
	else
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4190
		adapter->phy_hang_count = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4191
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4192
	if (adapter->phy_hang_count > 1) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4193
		adapter->phy_hang_count = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4194
		schedule_work(&adapter->reset_task);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4195
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4196
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4197
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4198
/**
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4199
 * e1000_watchdog - Timer Call-back
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4200
 * @data: pointer to adapter cast into an unsigned long
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4201
 **/
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4202
static void e1000_watchdog(unsigned long data)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4203
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4204
	struct e1000_adapter *adapter = (struct e1000_adapter *) data;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4205
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4206
	/* Do the rest outside of interrupt context */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4207
	schedule_work(&adapter->watchdog_task);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4208
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4209
	/* TODO: make this use queue_delayed_work() */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4210
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4211
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4212
static void e1000_watchdog_task(struct work_struct *work)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4213
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4214
	struct e1000_adapter *adapter = container_of(work,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4215
					struct e1000_adapter, watchdog_task);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4216
	struct net_device *netdev = adapter->netdev;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4217
	struct e1000_mac_info *mac = &adapter->hw.mac;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4218
	struct e1000_phy_info *phy = &adapter->hw.phy;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4219
	struct e1000_ring *tx_ring = adapter->tx_ring;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4220
	struct e1000_hw *hw = &adapter->hw;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4221
	u32 link, tctl;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4222
	int tx_pending = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4223
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4224
	link = e1000e_has_link(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4225
	if ((adapter->ecdev && (ecdev_get_link(adapter->ecdev)) && link)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4226
			|| (!adapter->ecdev && (netif_carrier_ok(netdev)) && link)) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4227
		if (!adapter->ecdev) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4228
			/* Cancel scheduled suspend requests. */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4229
			pm_runtime_resume(netdev->dev.parent);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4230
		}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4231
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4232
		e1000e_enable_receives(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4233
		goto link_up;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4234
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4235
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4236
	if ((e1000e_enable_tx_pkt_filtering(hw)) &&
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4237
	    (adapter->mng_vlan_id != adapter->hw.mng_cookie.vlan_id))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4238
		e1000_update_mng_vlan(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4239
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4240
	if (link) {
2421
bc2d4bf9cbe5 Removed trailing spaces.
Florian Pose <fp@igh-essen.com>
parents: 2234
diff changeset
  4241
		if ((adapter->ecdev && !ecdev_get_link(adapter->ecdev))
2219
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4242
				|| (!adapter->ecdev && !netif_carrier_ok(netdev))) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4243
			bool txb2b = 1;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4244
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4245
			/* Cancel scheduled suspend requests. */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4246
			pm_runtime_resume(netdev->dev.parent);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4247
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4248
			/* update snapshot of PHY registers on LSC */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4249
			e1000_phy_read_status(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4250
			mac->ops.get_link_up_info(&adapter->hw,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4251
						   &adapter->link_speed,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4252
						   &adapter->link_duplex);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4253
			e1000_print_link_info(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4254
			/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4255
			 * On supported PHYs, check for duplex mismatch only
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4256
			 * if link has autonegotiated at 10/100 half
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4257
			 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4258
			if ((hw->phy.type == e1000_phy_igp_3 ||
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4259
			     hw->phy.type == e1000_phy_bm) &&
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4260
			    (hw->mac.autoneg == true) &&
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4261
			    (adapter->link_speed == SPEED_10 ||
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4262
			     adapter->link_speed == SPEED_100) &&
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4263
			    (adapter->link_duplex == HALF_DUPLEX)) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4264
				u16 autoneg_exp;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4265
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4266
				e1e_rphy(hw, PHY_AUTONEG_EXP, &autoneg_exp);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4267
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4268
				if (!(autoneg_exp & NWAY_ER_LP_NWAY_CAPS))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4269
					e_info("Autonegotiated half duplex but"
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4270
					       " link partner cannot autoneg. "
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4271
					       " Try forcing full duplex if "
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4272
					       "link gets many collisions.\n");
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4273
			}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4274
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4275
			/* adjust timeout factor according to speed/duplex */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4276
			adapter->tx_timeout_factor = 1;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4277
			switch (adapter->link_speed) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4278
			case SPEED_10:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4279
				txb2b = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4280
				adapter->tx_timeout_factor = 16;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4281
				break;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4282
			case SPEED_100:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4283
				txb2b = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4284
				adapter->tx_timeout_factor = 10;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4285
				break;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4286
			}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4287
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4288
			/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4289
			 * workaround: re-program speed mode bit after
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4290
			 * link-up event
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4291
			 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4292
			if ((adapter->flags & FLAG_TARC_SPEED_MODE_BIT) &&
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4293
			    !txb2b) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4294
				u32 tarc0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4295
				tarc0 = er32(TARC(0));
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4296
				tarc0 &= ~SPEED_MODE_BIT;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4297
				ew32(TARC(0), tarc0);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4298
			}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4299
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4300
			/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4301
			 * disable TSO for pcie and 10/100 speeds, to avoid
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4302
			 * some hardware issues
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4303
			 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4304
			if (!(adapter->flags & FLAG_TSO_FORCE)) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4305
				switch (adapter->link_speed) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4306
				case SPEED_10:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4307
				case SPEED_100:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4308
					e_info("10/100 speed: disabling TSO\n");
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4309
					netdev->features &= ~NETIF_F_TSO;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4310
					netdev->features &= ~NETIF_F_TSO6;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4311
					break;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4312
				case SPEED_1000:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4313
					netdev->features |= NETIF_F_TSO;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4314
					netdev->features |= NETIF_F_TSO6;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4315
					break;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4316
				default:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4317
					/* oops */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4318
					break;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4319
				}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4320
			}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4321
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4322
			/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4323
			 * enable transmits in the hardware, need to do this
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4324
			 * after setting TARC(0)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4325
			 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4326
			tctl = er32(TCTL);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4327
			tctl |= E1000_TCTL_EN;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4328
			ew32(TCTL, tctl);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4329
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4330
                        /*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4331
			 * Perform any post-link-up configuration before
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4332
			 * reporting link up.
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4333
			 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4334
			if (phy->ops.cfg_on_link_up)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4335
				phy->ops.cfg_on_link_up(hw);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4336
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4337
			if (adapter->ecdev)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4338
				ecdev_set_link(adapter->ecdev, 1);
2421
bc2d4bf9cbe5 Removed trailing spaces.
Florian Pose <fp@igh-essen.com>
parents: 2234
diff changeset
  4339
			else
2219
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4340
				netif_carrier_on(netdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4341
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4342
			if (!adapter->ecdev && !test_bit(__E1000_DOWN, &adapter->state))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4343
				mod_timer(&adapter->phy_info_timer,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4344
					  round_jiffies(jiffies + 2 * HZ));
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4345
		}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4346
	} else {
2421
bc2d4bf9cbe5 Removed trailing spaces.
Florian Pose <fp@igh-essen.com>
parents: 2234
diff changeset
  4347
		if ((adapter->ecdev && ecdev_get_link(adapter->ecdev))
2219
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4348
				|| (!adapter->ecdev && netif_carrier_ok(netdev))) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4349
			adapter->link_speed = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4350
			adapter->link_duplex = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4351
			/* Link status message must follow this format */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4352
			printk(KERN_INFO "e1000e: %s NIC Link is Down\n",
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4353
			       adapter->netdev->name);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4354
			if (adapter->ecdev)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4355
				ecdev_set_link(adapter->ecdev, 0);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4356
			else
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4357
				netif_carrier_off(netdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4358
			if (!adapter->ecdev && !test_bit(__E1000_DOWN, &adapter->state))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4359
				mod_timer(&adapter->phy_info_timer,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4360
					  round_jiffies(jiffies + 2 * HZ));
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4361
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4362
			if (adapter->flags & FLAG_RX_NEEDS_RESTART)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4363
				schedule_work(&adapter->reset_task);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4364
			else
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4365
				pm_schedule_suspend(netdev->dev.parent,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4366
							LINK_TIMEOUT);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4367
		}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4368
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4369
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4370
link_up:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4371
	e1000e_update_stats(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4372
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4373
	mac->tx_packet_delta = adapter->stats.tpt - adapter->tpt_old;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4374
	adapter->tpt_old = adapter->stats.tpt;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4375
	mac->collision_delta = adapter->stats.colc - adapter->colc_old;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4376
	adapter->colc_old = adapter->stats.colc;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4377
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4378
	adapter->gorc = adapter->stats.gorc - adapter->gorc_old;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4379
	adapter->gorc_old = adapter->stats.gorc;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4380
	adapter->gotc = adapter->stats.gotc - adapter->gotc_old;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4381
	adapter->gotc_old = adapter->stats.gotc;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4382
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4383
	e1000e_update_adaptive(&adapter->hw);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4384
2500
97fd83907c7c Fixed repeating e1000e reset while link down, thanks to J. Kunz.
Florian Pose <fp@igh-essen.com>
parents: 2499
diff changeset
  4385
	if (!adapter->ecdev && !netif_carrier_ok(netdev)) {
2219
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4386
		tx_pending = (e1000_desc_unused(tx_ring) + 1 <
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4387
			       tx_ring->count);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4388
		if (tx_pending) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4389
			/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4390
			 * We've lost link, so the controller stops DMA,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4391
			 * but we've got queued Tx work that's never going
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4392
			 * to get done, so reset controller to flush Tx.
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4393
			 * (Do the reset outside of interrupt context).
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4394
			 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4395
			adapter->tx_timeout_count++;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4396
			schedule_work(&adapter->reset_task);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4397
			/* return immediately since reset is imminent */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4398
			return;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4399
		}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4400
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4401
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4402
	/* Simple mode for Interrupt Throttle Rate (ITR) */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4403
	if (adapter->itr_setting == 4) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4404
		/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4405
		 * Symmetric Tx/Rx gets a reduced ITR=2000;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4406
		 * Total asymmetrical Tx or Rx gets ITR=8000;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4407
		 * everyone else is between 2000-8000.
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4408
		 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4409
		u32 goc = (adapter->gotc + adapter->gorc) / 10000;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4410
		u32 dif = (adapter->gotc > adapter->gorc ?
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4411
			    adapter->gotc - adapter->gorc :
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4412
			    adapter->gorc - adapter->gotc) / 10000;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4413
		u32 itr = goc > 0 ? (dif * 6000 / goc + 2000) : 8000;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4414
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4415
		ew32(ITR, 1000000000 / (itr * 256));
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4416
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4417
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4418
	/* Cause software interrupt to ensure Rx ring is cleaned */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4419
	if (adapter->msix_entries)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4420
		ew32(ICS, adapter->rx_ring->ims_val);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4421
	else
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4422
		ew32(ICS, E1000_ICS_RXDMT0);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4423
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4424
	/* Force detection of hung controller every watchdog period */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4425
	adapter->detect_tx_hung = 1;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4426
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4427
	/* flush partial descriptors to memory before detecting tx hang */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4428
	if (adapter->flags2 & FLAG2_DMA_BURST) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4429
		ew32(TIDV, adapter->tx_int_delay | E1000_TIDV_FPD);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4430
		ew32(RDTR, adapter->rx_int_delay | E1000_RDTR_FPD);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4431
		/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4432
		 * no need to flush the writes because the timeout code does
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4433
		 * an er32 first thing
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4434
		 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4435
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4436
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4437
	/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4438
	 * With 82571 controllers, LAA may be overwritten due to controller
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4439
	 * reset from the other port. Set the appropriate LAA in RAR[0]
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4440
	 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4441
	if (e1000e_get_laa_state_82571(hw))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4442
		e1000e_rar_set(hw, adapter->hw.mac.addr, 0);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4443
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4444
	if (adapter->flags2 & FLAG2_CHECK_PHY_HANG)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4445
		e1000e_check_82574_phy_workaround(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4446
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4447
	/* Reset the timer */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4448
	if (!adapter->ecdev && !test_bit(__E1000_DOWN, &adapter->state))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4449
		mod_timer(&adapter->watchdog_timer,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4450
			  round_jiffies(jiffies + 2 * HZ));
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4451
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4452
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4453
#define E1000_TX_FLAGS_CSUM		0x00000001
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4454
#define E1000_TX_FLAGS_VLAN		0x00000002
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4455
#define E1000_TX_FLAGS_TSO		0x00000004
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4456
#define E1000_TX_FLAGS_IPV4		0x00000008
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4457
#define E1000_TX_FLAGS_VLAN_MASK	0xffff0000
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4458
#define E1000_TX_FLAGS_VLAN_SHIFT	16
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4459
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4460
static int e1000_tso(struct e1000_adapter *adapter,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4461
		     struct sk_buff *skb)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4462
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4463
	struct e1000_ring *tx_ring = adapter->tx_ring;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4464
	struct e1000_context_desc *context_desc;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4465
	struct e1000_buffer *buffer_info;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4466
	unsigned int i;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4467
	u32 cmd_length = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4468
	u16 ipcse = 0, tucse, mss;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4469
	u8 ipcss, ipcso, tucss, tucso, hdr_len;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4470
	int err;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4471
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4472
	if (!skb_is_gso(skb))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4473
		return 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4474
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4475
	if (skb_header_cloned(skb)) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4476
		err = pskb_expand_head(skb, 0, 0, GFP_ATOMIC);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4477
		if (err)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4478
			return err;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4479
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4480
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4481
	hdr_len = skb_transport_offset(skb) + tcp_hdrlen(skb);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4482
	mss = skb_shinfo(skb)->gso_size;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4483
	if (skb->protocol == htons(ETH_P_IP)) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4484
		struct iphdr *iph = ip_hdr(skb);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4485
		iph->tot_len = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4486
		iph->check = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4487
		tcp_hdr(skb)->check = ~csum_tcpudp_magic(iph->saddr, iph->daddr,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4488
		                                         0, IPPROTO_TCP, 0);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4489
		cmd_length = E1000_TXD_CMD_IP;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4490
		ipcse = skb_transport_offset(skb) - 1;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4491
	} else if (skb_is_gso_v6(skb)) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4492
		ipv6_hdr(skb)->payload_len = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4493
		tcp_hdr(skb)->check = ~csum_ipv6_magic(&ipv6_hdr(skb)->saddr,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4494
		                                       &ipv6_hdr(skb)->daddr,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4495
		                                       0, IPPROTO_TCP, 0);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4496
		ipcse = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4497
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4498
	ipcss = skb_network_offset(skb);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4499
	ipcso = (void *)&(ip_hdr(skb)->check) - (void *)skb->data;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4500
	tucss = skb_transport_offset(skb);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4501
	tucso = (void *)&(tcp_hdr(skb)->check) - (void *)skb->data;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4502
	tucse = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4503
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4504
	cmd_length |= (E1000_TXD_CMD_DEXT | E1000_TXD_CMD_TSE |
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4505
	               E1000_TXD_CMD_TCP | (skb->len - (hdr_len)));
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4506
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4507
	i = tx_ring->next_to_use;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4508
	context_desc = E1000_CONTEXT_DESC(*tx_ring, i);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4509
	buffer_info = &tx_ring->buffer_info[i];
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4510
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4511
	context_desc->lower_setup.ip_fields.ipcss  = ipcss;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4512
	context_desc->lower_setup.ip_fields.ipcso  = ipcso;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4513
	context_desc->lower_setup.ip_fields.ipcse  = cpu_to_le16(ipcse);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4514
	context_desc->upper_setup.tcp_fields.tucss = tucss;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4515
	context_desc->upper_setup.tcp_fields.tucso = tucso;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4516
	context_desc->upper_setup.tcp_fields.tucse = cpu_to_le16(tucse);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4517
	context_desc->tcp_seg_setup.fields.mss     = cpu_to_le16(mss);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4518
	context_desc->tcp_seg_setup.fields.hdr_len = hdr_len;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4519
	context_desc->cmd_and_length = cpu_to_le32(cmd_length);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4520
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4521
	buffer_info->time_stamp = jiffies;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4522
	buffer_info->next_to_watch = i;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4523
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4524
	i++;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4525
	if (i == tx_ring->count)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4526
		i = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4527
	tx_ring->next_to_use = i;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4528
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4529
	return 1;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4530
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4531
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4532
static bool e1000_tx_csum(struct e1000_adapter *adapter, struct sk_buff *skb)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4533
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4534
	struct e1000_ring *tx_ring = adapter->tx_ring;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4535
	struct e1000_context_desc *context_desc;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4536
	struct e1000_buffer *buffer_info;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4537
	unsigned int i;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4538
	u8 css;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4539
	u32 cmd_len = E1000_TXD_CMD_DEXT;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4540
	__be16 protocol;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4541
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4542
	if (skb->ip_summed != CHECKSUM_PARTIAL)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4543
		return 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4544
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4545
	if (skb->protocol == cpu_to_be16(ETH_P_8021Q))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4546
		protocol = vlan_eth_hdr(skb)->h_vlan_encapsulated_proto;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4547
	else
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4548
		protocol = skb->protocol;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4549
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4550
	switch (protocol) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4551
	case cpu_to_be16(ETH_P_IP):
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4552
		if (ip_hdr(skb)->protocol == IPPROTO_TCP)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4553
			cmd_len |= E1000_TXD_CMD_TCP;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4554
		break;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4555
	case cpu_to_be16(ETH_P_IPV6):
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4556
		/* XXX not handling all IPV6 headers */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4557
		if (ipv6_hdr(skb)->nexthdr == IPPROTO_TCP)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4558
			cmd_len |= E1000_TXD_CMD_TCP;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4559
		break;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4560
	default:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4561
		if (unlikely(net_ratelimit()))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4562
			e_warn("checksum_partial proto=%x!\n",
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4563
			       be16_to_cpu(protocol));
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4564
		break;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4565
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4566
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4567
	css = skb_transport_offset(skb);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4568
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4569
	i = tx_ring->next_to_use;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4570
	buffer_info = &tx_ring->buffer_info[i];
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4571
	context_desc = E1000_CONTEXT_DESC(*tx_ring, i);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4572
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4573
	context_desc->lower_setup.ip_config = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4574
	context_desc->upper_setup.tcp_fields.tucss = css;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4575
	context_desc->upper_setup.tcp_fields.tucso =
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4576
				css + skb->csum_offset;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4577
	context_desc->upper_setup.tcp_fields.tucse = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4578
	context_desc->tcp_seg_setup.data = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4579
	context_desc->cmd_and_length = cpu_to_le32(cmd_len);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4580
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4581
	buffer_info->time_stamp = jiffies;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4582
	buffer_info->next_to_watch = i;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4583
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4584
	i++;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4585
	if (i == tx_ring->count)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4586
		i = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4587
	tx_ring->next_to_use = i;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4588
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4589
	return 1;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4590
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4591
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4592
#define E1000_MAX_PER_TXD	8192
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4593
#define E1000_MAX_TXD_PWR	12
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4594
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4595
static int e1000_tx_map(struct e1000_adapter *adapter,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4596
			struct sk_buff *skb, unsigned int first,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4597
			unsigned int max_per_txd, unsigned int nr_frags,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4598
			unsigned int mss)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4599
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4600
	struct e1000_ring *tx_ring = adapter->tx_ring;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4601
	struct pci_dev *pdev = adapter->pdev;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4602
	struct e1000_buffer *buffer_info;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4603
	unsigned int len = skb_headlen(skb);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4604
	unsigned int offset = 0, size, count = 0, i;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4605
	unsigned int f, bytecount, segs;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4606
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4607
	i = tx_ring->next_to_use;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4608
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4609
	while (len) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4610
		buffer_info = &tx_ring->buffer_info[i];
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4611
		size = min(len, max_per_txd);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4612
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4613
		buffer_info->length = size;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4614
		buffer_info->time_stamp = jiffies;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4615
		buffer_info->next_to_watch = i;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4616
		buffer_info->dma = dma_map_single(&pdev->dev,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4617
						  skb->data + offset,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4618
						  size,	DMA_TO_DEVICE);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4619
		buffer_info->mapped_as_page = false;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4620
		if (dma_mapping_error(&pdev->dev, buffer_info->dma))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4621
			goto dma_error;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4622
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4623
		len -= size;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4624
		offset += size;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4625
		count++;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4626
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4627
		if (len) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4628
			i++;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4629
			if (i == tx_ring->count)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4630
				i = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4631
		}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4632
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4633
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4634
	for (f = 0; f < nr_frags; f++) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4635
		struct skb_frag_struct *frag;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4636
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4637
		frag = &skb_shinfo(skb)->frags[f];
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4638
		len = frag->size;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4639
		offset = frag->page_offset;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4640
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4641
		while (len) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4642
			i++;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4643
			if (i == tx_ring->count)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4644
				i = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4645
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4646
			buffer_info = &tx_ring->buffer_info[i];
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4647
			size = min(len, max_per_txd);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4648
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4649
			buffer_info->length = size;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4650
			buffer_info->time_stamp = jiffies;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4651
			buffer_info->next_to_watch = i;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4652
			buffer_info->dma = dma_map_page(&pdev->dev, frag->page,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4653
							offset, size,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4654
							DMA_TO_DEVICE);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4655
			buffer_info->mapped_as_page = true;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4656
			if (dma_mapping_error(&pdev->dev, buffer_info->dma))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4657
				goto dma_error;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4658
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4659
			len -= size;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4660
			offset += size;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4661
			count++;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4662
		}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4663
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4664
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4665
	segs = skb_shinfo(skb)->gso_segs ?: 1;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4666
	/* multiply data chunks by size of headers */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4667
	bytecount = ((segs - 1) * skb_headlen(skb)) + skb->len;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4668
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4669
	tx_ring->buffer_info[i].skb = skb;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4670
	tx_ring->buffer_info[i].segs = segs;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4671
	tx_ring->buffer_info[i].bytecount = bytecount;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4672
	tx_ring->buffer_info[first].next_to_watch = i;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4673
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4674
	return count;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4675
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4676
dma_error:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4677
	dev_err(&pdev->dev, "TX DMA map failed\n");
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4678
	buffer_info->dma = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4679
	if (count)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4680
		count--;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4681
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4682
	while (count--) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4683
		if (i==0)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4684
			i += tx_ring->count;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4685
		i--;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4686
		buffer_info = &tx_ring->buffer_info[i];
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4687
		e1000_put_txbuf(adapter, buffer_info);;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4688
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4689
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4690
	return 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4691
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4692
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4693
static void e1000_tx_queue(struct e1000_adapter *adapter,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4694
			   int tx_flags, int count)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4695
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4696
	struct e1000_ring *tx_ring = adapter->tx_ring;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4697
	struct e1000_tx_desc *tx_desc = NULL;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4698
	struct e1000_buffer *buffer_info;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4699
	u32 txd_upper = 0, txd_lower = E1000_TXD_CMD_IFCS;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4700
	unsigned int i;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4701
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4702
	if (tx_flags & E1000_TX_FLAGS_TSO) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4703
		txd_lower |= E1000_TXD_CMD_DEXT | E1000_TXD_DTYP_D |
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4704
			     E1000_TXD_CMD_TSE;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4705
		txd_upper |= E1000_TXD_POPTS_TXSM << 8;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4706
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4707
		if (tx_flags & E1000_TX_FLAGS_IPV4)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4708
			txd_upper |= E1000_TXD_POPTS_IXSM << 8;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4709
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4710
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4711
	if (tx_flags & E1000_TX_FLAGS_CSUM) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4712
		txd_lower |= E1000_TXD_CMD_DEXT | E1000_TXD_DTYP_D;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4713
		txd_upper |= E1000_TXD_POPTS_TXSM << 8;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4714
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4715
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4716
	if (tx_flags & E1000_TX_FLAGS_VLAN) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4717
		txd_lower |= E1000_TXD_CMD_VLE;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4718
		txd_upper |= (tx_flags & E1000_TX_FLAGS_VLAN_MASK);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4719
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4720
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4721
	i = tx_ring->next_to_use;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4722
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4723
	while (count--) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4724
		buffer_info = &tx_ring->buffer_info[i];
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4725
		tx_desc = E1000_TX_DESC(*tx_ring, i);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4726
		tx_desc->buffer_addr = cpu_to_le64(buffer_info->dma);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4727
		tx_desc->lower.data =
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4728
			cpu_to_le32(txd_lower | buffer_info->length);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4729
		tx_desc->upper.data = cpu_to_le32(txd_upper);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4730
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4731
		i++;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4732
		if (i == tx_ring->count)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4733
			i = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4734
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4735
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4736
	tx_desc->lower.data |= cpu_to_le32(adapter->txd_cmd);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4737
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4738
	/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4739
	 * Force memory writes to complete before letting h/w
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4740
	 * know there are new descriptors to fetch.  (Only
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4741
	 * applicable for weak-ordered memory model archs,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4742
	 * such as IA-64).
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4743
	 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4744
	wmb();
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4745
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4746
	tx_ring->next_to_use = i;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4747
	writel(i, adapter->hw.hw_addr + tx_ring->tail);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4748
	/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4749
	 * we need this if more than one processor can write to our tail
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4750
	 * at a time, it synchronizes IO on IA64/Altix systems
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4751
	 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4752
	mmiowb();
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4753
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4754
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4755
#define MINIMUM_DHCP_PACKET_SIZE 282
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4756
static int e1000_transfer_dhcp_info(struct e1000_adapter *adapter,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4757
				    struct sk_buff *skb)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4758
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4759
	struct e1000_hw *hw =  &adapter->hw;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4760
	u16 length, offset;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4761
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4762
	if (vlan_tx_tag_present(skb)) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4763
		if (!((vlan_tx_tag_get(skb) == adapter->hw.mng_cookie.vlan_id) &&
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4764
		    (adapter->hw.mng_cookie.status &
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4765
			E1000_MNG_DHCP_COOKIE_STATUS_VLAN)))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4766
			return 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4767
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4768
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4769
	if (skb->len <= MINIMUM_DHCP_PACKET_SIZE)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4770
		return 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4771
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4772
	if (((struct ethhdr *) skb->data)->h_proto != htons(ETH_P_IP))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4773
		return 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4774
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4775
	{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4776
		const struct iphdr *ip = (struct iphdr *)((u8 *)skb->data+14);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4777
		struct udphdr *udp;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4778
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4779
		if (ip->protocol != IPPROTO_UDP)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4780
			return 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4781
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4782
		udp = (struct udphdr *)((u8 *)ip + (ip->ihl << 2));
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4783
		if (ntohs(udp->dest) != 67)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4784
			return 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4785
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4786
		offset = (u8 *)udp + 8 - skb->data;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4787
		length = skb->len - offset;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4788
		return e1000e_mng_write_dhcp_info(hw, (u8 *)udp + 8, length);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4789
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4790
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4791
	return 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4792
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4793
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4794
static int __e1000_maybe_stop_tx(struct net_device *netdev, int size)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4795
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4796
	struct e1000_adapter *adapter = netdev_priv(netdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4797
2472
50b861e981f7 Fixed __e1000_maybe_stop_tx() for e1000e.
Florian Pose <fp@igh-essen.com>
parents: 2421
diff changeset
  4798
	if (adapter->ecdev) {
50b861e981f7 Fixed __e1000_maybe_stop_tx() for e1000e.
Florian Pose <fp@igh-essen.com>
parents: 2421
diff changeset
  4799
		return -EBUSY;
50b861e981f7 Fixed __e1000_maybe_stop_tx() for e1000e.
Florian Pose <fp@igh-essen.com>
parents: 2421
diff changeset
  4800
	}
50b861e981f7 Fixed __e1000_maybe_stop_tx() for e1000e.
Florian Pose <fp@igh-essen.com>
parents: 2421
diff changeset
  4801
2219
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4802
	netif_stop_queue(netdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4803
	/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4804
	 * Herbert's original patch had:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4805
	 *  smp_mb__after_netif_stop_queue();
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4806
	 * but since that doesn't exist yet, just open code it.
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4807
	 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4808
	smp_mb();
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4809
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4810
	/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4811
	 * We need to check again in a case another CPU has just
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4812
	 * made room available.
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4813
	 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4814
	if (e1000_desc_unused(adapter->tx_ring) < size)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4815
		return -EBUSY;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4816
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4817
	/* A reprieve! */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4818
	netif_start_queue(netdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4819
	++adapter->restart_queue;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4820
	return 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4821
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4822
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4823
static int e1000_maybe_stop_tx(struct net_device *netdev, int size)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4824
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4825
	struct e1000_adapter *adapter = netdev_priv(netdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4826
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4827
	if (e1000_desc_unused(adapter->tx_ring) >= size)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4828
		return 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4829
	return __e1000_maybe_stop_tx(netdev, size);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4830
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4831
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4832
#define TXD_USE_COUNT(S, X) (((S) >> (X)) + 1 )
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4833
static netdev_tx_t e1000_xmit_frame(struct sk_buff *skb,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4834
				    struct net_device *netdev)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4835
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4836
	struct e1000_adapter *adapter = netdev_priv(netdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4837
	struct e1000_ring *tx_ring = adapter->tx_ring;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4838
	unsigned int first;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4839
	unsigned int max_per_txd = E1000_MAX_PER_TXD;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4840
	unsigned int max_txd_pwr = E1000_MAX_TXD_PWR;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4841
	unsigned int tx_flags = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4842
	unsigned int len = skb_headlen(skb);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4843
	unsigned int nr_frags;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4844
	unsigned int mss;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4845
	int count = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4846
	int tso;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4847
	unsigned int f;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4848
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4849
	if (test_bit(__E1000_DOWN, &adapter->state)) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4850
		if (!adapter->ecdev)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4851
			dev_kfree_skb_any(skb);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4852
		return NETDEV_TX_OK;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4853
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4854
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4855
	if (skb->len <= 0) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4856
		if (!adapter->ecdev)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4857
			dev_kfree_skb_any(skb);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4858
		return NETDEV_TX_OK;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4859
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4860
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4861
	mss = skb_shinfo(skb)->gso_size;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4862
	/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4863
	 * The controller does a simple calculation to
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4864
	 * make sure there is enough room in the FIFO before
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4865
	 * initiating the DMA for each buffer.  The calc is:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4866
	 * 4 = ceil(buffer len/mss).  To make sure we don't
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4867
	 * overrun the FIFO, adjust the max buffer len if mss
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4868
	 * drops.
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4869
	 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4870
	if (mss) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4871
		u8 hdr_len;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4872
		max_per_txd = min(mss << 2, max_per_txd);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4873
		max_txd_pwr = fls(max_per_txd) - 1;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4874
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4875
		/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4876
		 * TSO Workaround for 82571/2/3 Controllers -- if skb->data
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4877
		 * points to just header, pull a few bytes of payload from
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4878
		 * frags into skb->data
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4879
		 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4880
		hdr_len = skb_transport_offset(skb) + tcp_hdrlen(skb);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4881
		/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4882
		 * we do this workaround for ES2LAN, but it is un-necessary,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4883
		 * avoiding it could save a lot of cycles
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4884
		 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4885
		if (skb->data_len && (hdr_len == len)) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4886
			unsigned int pull_size;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4887
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4888
			pull_size = min((unsigned int)4, skb->data_len);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4889
			if (!__pskb_pull_tail(skb, pull_size)) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4890
				e_err("__pskb_pull_tail failed.\n");
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4891
				if (!adapter->ecdev)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4892
					dev_kfree_skb_any(skb);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4893
				return NETDEV_TX_OK;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4894
			}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4895
			len = skb_headlen(skb);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4896
		}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4897
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4898
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4899
	/* reserve a descriptor for the offload context */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4900
	if ((mss) || (skb->ip_summed == CHECKSUM_PARTIAL))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4901
		count++;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4902
	count++;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4903
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4904
	count += TXD_USE_COUNT(len, max_txd_pwr);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4905
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4906
	nr_frags = skb_shinfo(skb)->nr_frags;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4907
	for (f = 0; f < nr_frags; f++)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4908
		count += TXD_USE_COUNT(skb_shinfo(skb)->frags[f].size,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4909
				       max_txd_pwr);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4910
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4911
	if (adapter->hw.mac.tx_pkt_filtering)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4912
		e1000_transfer_dhcp_info(adapter, skb);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4913
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4914
	/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4915
	 * need: count + 2 desc gap to keep tail from touching
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4916
	 * head, otherwise try next time
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4917
	 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4918
	if (!adapter->ecdev && e1000_maybe_stop_tx(netdev, count + 2))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4919
		return NETDEV_TX_BUSY;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4920
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4921
	if (vlan_tx_tag_present(skb)) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4922
		tx_flags |= E1000_TX_FLAGS_VLAN;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4923
		tx_flags |= (vlan_tx_tag_get(skb) << E1000_TX_FLAGS_VLAN_SHIFT);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4924
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4925
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4926
	first = tx_ring->next_to_use;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4927
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4928
	tso = e1000_tso(adapter, skb);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4929
	if (tso < 0) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4930
		if (!adapter->ecdev)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4931
			dev_kfree_skb_any(skb);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4932
		return NETDEV_TX_OK;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4933
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4934
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4935
	if (tso)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4936
		tx_flags |= E1000_TX_FLAGS_TSO;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4937
	else if (e1000_tx_csum(adapter, skb))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4938
		tx_flags |= E1000_TX_FLAGS_CSUM;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4939
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4940
	/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4941
	 * Old method was to assume IPv4 packet by default if TSO was enabled.
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4942
	 * 82571 hardware supports TSO capabilities for IPv6 as well...
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4943
	 * no longer assume, we must.
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4944
	 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4945
	if (skb->protocol == htons(ETH_P_IP))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4946
		tx_flags |= E1000_TX_FLAGS_IPV4;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4947
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4948
	/* if count is 0 then mapping error has occured */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4949
	count = e1000_tx_map(adapter, skb, first, max_per_txd, nr_frags, mss);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4950
	if (count) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4951
		e1000_tx_queue(adapter, tx_flags, count);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4952
		/* Make sure there is space in the ring for the next send. */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4953
		if (!adapter->ecdev)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4954
			e1000_maybe_stop_tx(netdev, MAX_SKB_FRAGS + 2);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4955
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4956
	} else {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4957
		if (!adapter->ecdev)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4958
			dev_kfree_skb_any(skb);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4959
		tx_ring->buffer_info[first].time_stamp = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4960
		tx_ring->next_to_use = first;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4961
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4962
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4963
	return NETDEV_TX_OK;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4964
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4965
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4966
/**
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4967
 * e1000_tx_timeout - Respond to a Tx Hang
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4968
 * @netdev: network interface device structure
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4969
 **/
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4970
static void e1000_tx_timeout(struct net_device *netdev)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4971
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4972
	struct e1000_adapter *adapter = netdev_priv(netdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4973
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4974
	/* Do the reset outside of interrupt context */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4975
	adapter->tx_timeout_count++;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4976
	schedule_work(&adapter->reset_task);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4977
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4978
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4979
static void e1000_reset_task(struct work_struct *work)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4980
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4981
	struct e1000_adapter *adapter;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4982
	adapter = container_of(work, struct e1000_adapter, reset_task);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4983
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4984
	if (!((adapter->flags & FLAG_RX_NEEDS_RESTART) &&
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4985
	      (adapter->flags & FLAG_RX_RESTART_NOW))) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4986
		e1000e_dump(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4987
		e_err("Reset adapter\n");
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4988
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4989
	e1000e_reinit_locked(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4990
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4991
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4992
/**
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4993
 * e1000_get_stats - Get System Network Statistics
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4994
 * @netdev: network interface device structure
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4995
 *
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4996
 * Returns the address of the device statistics structure.
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4997
 * The statistics are actually updated from the timer callback.
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4998
 **/
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4999
static struct net_device_stats *e1000_get_stats(struct net_device *netdev)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5000
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5001
	/* only return the current stats */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5002
	return &netdev->stats;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5003
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5004
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5005
/**
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5006
 * e1000_change_mtu - Change the Maximum Transfer Unit
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5007
 * @netdev: network interface device structure
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5008
 * @new_mtu: new value for maximum frame size
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5009
 *
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5010
 * Returns 0 on success, negative on failure
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5011
 **/
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5012
static int e1000_change_mtu(struct net_device *netdev, int new_mtu)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5013
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5014
	struct e1000_adapter *adapter = netdev_priv(netdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5015
	int max_frame = new_mtu + ETH_HLEN + ETH_FCS_LEN;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5016
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5017
	if (adapter->ecdev)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5018
		return -EBUSY;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5019
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5020
	/* Jumbo frame support */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5021
	if ((max_frame > ETH_FRAME_LEN + ETH_FCS_LEN) &&
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5022
	    !(adapter->flags & FLAG_HAS_JUMBO_FRAMES)) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5023
		e_err("Jumbo Frames not supported.\n");
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5024
		return -EINVAL;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5025
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5026
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5027
	/* Supported frame sizes */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5028
	if ((new_mtu < ETH_ZLEN + ETH_FCS_LEN + VLAN_HLEN) ||
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5029
	    (max_frame > adapter->max_hw_frame_size)) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5030
		e_err("Unsupported MTU setting\n");
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5031
		return -EINVAL;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5032
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5033
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5034
	/* Jumbo frame workaround on 82579 requires CRC be stripped */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5035
	if ((adapter->hw.mac.type == e1000_pch2lan) &&
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5036
	    !(adapter->flags2 & FLAG2_CRC_STRIPPING) &&
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5037
	    (new_mtu > ETH_DATA_LEN)) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5038
		e_err("Jumbo Frames not supported on 82579 when CRC "
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5039
		      "stripping is disabled.\n");
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5040
		return -EINVAL;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5041
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5042
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5043
	/* 82573 Errata 17 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5044
	if (((adapter->hw.mac.type == e1000_82573) ||
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5045
	     (adapter->hw.mac.type == e1000_82574)) &&
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5046
	    (max_frame > ETH_FRAME_LEN + ETH_FCS_LEN)) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5047
		adapter->flags2 |= FLAG2_DISABLE_ASPM_L1;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5048
		e1000e_disable_aspm(adapter->pdev, PCIE_LINK_STATE_L1);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5049
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5050
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5051
	while (test_and_set_bit(__E1000_RESETTING, &adapter->state))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5052
		msleep(1);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5053
	/* e1000e_down -> e1000e_reset dependent on max_frame_size & mtu */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5054
	adapter->max_frame_size = max_frame;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5055
	e_info("changing MTU from %d to %d\n", netdev->mtu, new_mtu);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5056
	netdev->mtu = new_mtu;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5057
	if (netif_running(netdev))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5058
		e1000e_down(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5059
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5060
	/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5061
	 * NOTE: netdev_alloc_skb reserves 16 bytes, and typically NET_IP_ALIGN
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5062
	 * means we reserve 2 more, this pushes us to allocate from the next
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5063
	 * larger slab size.
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5064
	 * i.e. RXBUFFER_2048 --> size-4096 slab
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5065
	 * However with the new *_jumbo_rx* routines, jumbo receives will use
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5066
	 * fragmented skbs
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5067
	 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5068
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5069
	if (max_frame <= 2048)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5070
		adapter->rx_buffer_len = 2048;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5071
	else
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5072
		adapter->rx_buffer_len = 4096;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5073
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5074
	/* adjust allocation if LPE protects us, and we aren't using SBP */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5075
	if ((max_frame == ETH_FRAME_LEN + ETH_FCS_LEN) ||
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5076
	     (max_frame == ETH_FRAME_LEN + VLAN_HLEN + ETH_FCS_LEN))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5077
		adapter->rx_buffer_len = ETH_FRAME_LEN + VLAN_HLEN
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5078
					 + ETH_FCS_LEN;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5079
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5080
	if (netif_running(netdev))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5081
		e1000e_up(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5082
	else
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5083
		e1000e_reset(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5084
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5085
	clear_bit(__E1000_RESETTING, &adapter->state);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5086
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5087
	return 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5088
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5089
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5090
static int e1000_mii_ioctl(struct net_device *netdev, struct ifreq *ifr,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5091
			   int cmd)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5092
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5093
	struct e1000_adapter *adapter = netdev_priv(netdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5094
	struct mii_ioctl_data *data = if_mii(ifr);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5095
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5096
	if (adapter->hw.phy.media_type != e1000_media_type_copper)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5097
		return -EOPNOTSUPP;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5098
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5099
	switch (cmd) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5100
	case SIOCGMIIPHY:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5101
		data->phy_id = adapter->hw.phy.addr;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5102
		break;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5103
	case SIOCGMIIREG:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5104
		e1000_phy_read_status(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5105
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5106
		switch (data->reg_num & 0x1F) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5107
		case MII_BMCR:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5108
			data->val_out = adapter->phy_regs.bmcr;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5109
			break;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5110
		case MII_BMSR:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5111
			data->val_out = adapter->phy_regs.bmsr;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5112
			break;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5113
		case MII_PHYSID1:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5114
			data->val_out = (adapter->hw.phy.id >> 16);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5115
			break;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5116
		case MII_PHYSID2:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5117
			data->val_out = (adapter->hw.phy.id & 0xFFFF);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5118
			break;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5119
		case MII_ADVERTISE:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5120
			data->val_out = adapter->phy_regs.advertise;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5121
			break;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5122
		case MII_LPA:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5123
			data->val_out = adapter->phy_regs.lpa;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5124
			break;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5125
		case MII_EXPANSION:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5126
			data->val_out = adapter->phy_regs.expansion;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5127
			break;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5128
		case MII_CTRL1000:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5129
			data->val_out = adapter->phy_regs.ctrl1000;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5130
			break;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5131
		case MII_STAT1000:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5132
			data->val_out = adapter->phy_regs.stat1000;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5133
			break;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5134
		case MII_ESTATUS:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5135
			data->val_out = adapter->phy_regs.estatus;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5136
			break;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5137
		default:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5138
			return -EIO;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5139
		}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5140
		break;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5141
	case SIOCSMIIREG:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5142
	default:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5143
		return -EOPNOTSUPP;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5144
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5145
	return 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5146
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5147
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5148
static int e1000_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5149
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5150
	switch (cmd) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5151
	case SIOCGMIIPHY:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5152
	case SIOCGMIIREG:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5153
	case SIOCSMIIREG:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5154
		return e1000_mii_ioctl(netdev, ifr, cmd);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5155
	default:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5156
		return -EOPNOTSUPP;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5157
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5158
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5159
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5160
static int e1000_init_phy_wakeup(struct e1000_adapter *adapter, u32 wufc)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5161
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5162
	struct e1000_hw *hw = &adapter->hw;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5163
	u32 i, mac_reg;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5164
	u16 phy_reg;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5165
	int retval = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5166
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5167
	/* copy MAC RARs to PHY RARs */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5168
	e1000_copy_rx_addrs_to_phy_ich8lan(hw);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5169
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5170
	/* copy MAC MTA to PHY MTA */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5171
	for (i = 0; i < adapter->hw.mac.mta_reg_count; i++) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5172
		mac_reg = E1000_READ_REG_ARRAY(hw, E1000_MTA, i);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5173
		e1e_wphy(hw, BM_MTA(i), (u16)(mac_reg & 0xFFFF));
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5174
		e1e_wphy(hw, BM_MTA(i) + 1, (u16)((mac_reg >> 16) & 0xFFFF));
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5175
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5176
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5177
	/* configure PHY Rx Control register */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5178
	e1e_rphy(&adapter->hw, BM_RCTL, &phy_reg);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5179
	mac_reg = er32(RCTL);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5180
	if (mac_reg & E1000_RCTL_UPE)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5181
		phy_reg |= BM_RCTL_UPE;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5182
	if (mac_reg & E1000_RCTL_MPE)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5183
		phy_reg |= BM_RCTL_MPE;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5184
	phy_reg &= ~(BM_RCTL_MO_MASK);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5185
	if (mac_reg & E1000_RCTL_MO_3)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5186
		phy_reg |= (((mac_reg & E1000_RCTL_MO_3) >> E1000_RCTL_MO_SHIFT)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5187
				<< BM_RCTL_MO_SHIFT);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5188
	if (mac_reg & E1000_RCTL_BAM)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5189
		phy_reg |= BM_RCTL_BAM;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5190
	if (mac_reg & E1000_RCTL_PMCF)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5191
		phy_reg |= BM_RCTL_PMCF;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5192
	mac_reg = er32(CTRL);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5193
	if (mac_reg & E1000_CTRL_RFCE)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5194
		phy_reg |= BM_RCTL_RFCE;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5195
	e1e_wphy(&adapter->hw, BM_RCTL, phy_reg);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5196
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5197
	/* enable PHY wakeup in MAC register */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5198
	ew32(WUFC, wufc);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5199
	ew32(WUC, E1000_WUC_PHY_WAKE | E1000_WUC_PME_EN);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5200
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5201
	/* configure and enable PHY wakeup in PHY registers */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5202
	e1e_wphy(&adapter->hw, BM_WUFC, wufc);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5203
	e1e_wphy(&adapter->hw, BM_WUC, E1000_WUC_PME_EN);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5204
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5205
	/* activate PHY wakeup */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5206
	retval = hw->phy.ops.acquire(hw);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5207
	if (retval) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5208
		e_err("Could not acquire PHY\n");
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5209
		return retval;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5210
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5211
	e1000e_write_phy_reg_mdic(hw, IGP01E1000_PHY_PAGE_SELECT,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5212
	                         (BM_WUC_ENABLE_PAGE << IGP_PAGE_SHIFT));
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5213
	retval = e1000e_read_phy_reg_mdic(hw, BM_WUC_ENABLE_REG, &phy_reg);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5214
	if (retval) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5215
		e_err("Could not read PHY page 769\n");
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5216
		goto out;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5217
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5218
	phy_reg |= BM_WUC_ENABLE_BIT | BM_WUC_HOST_WU_BIT;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5219
	retval = e1000e_write_phy_reg_mdic(hw, BM_WUC_ENABLE_REG, phy_reg);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5220
	if (retval)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5221
		e_err("Could not set PHY Host Wakeup bit\n");
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5222
out:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5223
	hw->phy.ops.release(hw);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5224
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5225
	return retval;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5226
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5227
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5228
static int __e1000_shutdown(struct pci_dev *pdev, bool *enable_wake,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5229
			    bool runtime)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5230
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5231
	struct net_device *netdev = pci_get_drvdata(pdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5232
	struct e1000_adapter *adapter = netdev_priv(netdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5233
	struct e1000_hw *hw = &adapter->hw;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5234
	u32 ctrl, ctrl_ext, rctl, status;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5235
	/* Runtime suspend should only enable wakeup for link changes */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5236
	u32 wufc = runtime ? E1000_WUFC_LNKC : adapter->wol;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5237
	int retval = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5238
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5239
	netif_device_detach(netdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5240
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5241
	if (netif_running(netdev)) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5242
		WARN_ON(test_bit(__E1000_RESETTING, &adapter->state));
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5243
		e1000e_down(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5244
		e1000_free_irq(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5245
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5246
	e1000e_reset_interrupt_capability(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5247
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5248
	retval = pci_save_state(pdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5249
	if (retval)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5250
		return retval;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5251
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5252
	status = er32(STATUS);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5253
	if (status & E1000_STATUS_LU)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5254
		wufc &= ~E1000_WUFC_LNKC;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5255
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5256
	if (wufc) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5257
		e1000_setup_rctl(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5258
		e1000_set_multi(netdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5259
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5260
		/* turn on all-multi mode if wake on multicast is enabled */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5261
		if (wufc & E1000_WUFC_MC) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5262
			rctl = er32(RCTL);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5263
			rctl |= E1000_RCTL_MPE;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5264
			ew32(RCTL, rctl);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5265
		}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5266
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5267
		ctrl = er32(CTRL);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5268
		/* advertise wake from D3Cold */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5269
		#define E1000_CTRL_ADVD3WUC 0x00100000
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5270
		/* phy power management enable */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5271
		#define E1000_CTRL_EN_PHY_PWR_MGMT 0x00200000
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5272
		ctrl |= E1000_CTRL_ADVD3WUC;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5273
		if (!(adapter->flags2 & FLAG2_HAS_PHY_WAKEUP))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5274
			ctrl |= E1000_CTRL_EN_PHY_PWR_MGMT;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5275
		ew32(CTRL, ctrl);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5276
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5277
		if (adapter->hw.phy.media_type == e1000_media_type_fiber ||
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5278
		    adapter->hw.phy.media_type ==
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5279
		    e1000_media_type_internal_serdes) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5280
			/* keep the laser running in D3 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5281
			ctrl_ext = er32(CTRL_EXT);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5282
			ctrl_ext |= E1000_CTRL_EXT_SDP3_DATA;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5283
			ew32(CTRL_EXT, ctrl_ext);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5284
		}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5285
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5286
		if (adapter->flags & FLAG_IS_ICH)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5287
			e1000e_disable_gig_wol_ich8lan(&adapter->hw);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5288
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5289
		/* Allow time for pending master requests to run */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5290
		e1000e_disable_pcie_master(&adapter->hw);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5291
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5292
		if (adapter->flags2 & FLAG2_HAS_PHY_WAKEUP) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5293
			/* enable wakeup by the PHY */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5294
			retval = e1000_init_phy_wakeup(adapter, wufc);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5295
			if (retval)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5296
				return retval;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5297
		} else {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5298
			/* enable wakeup by the MAC */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5299
			ew32(WUFC, wufc);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5300
			ew32(WUC, E1000_WUC_PME_EN);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5301
		}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5302
	} else {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5303
		ew32(WUC, 0);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5304
		ew32(WUFC, 0);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5305
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5306
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5307
	*enable_wake = !!wufc;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5308
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5309
	/* make sure adapter isn't asleep if manageability is enabled */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5310
	if ((adapter->flags & FLAG_MNG_PT_ENABLED) ||
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5311
	    (hw->mac.ops.check_mng_mode(hw)))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5312
		*enable_wake = true;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5313
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5314
	if (adapter->hw.phy.type == e1000_phy_igp_3)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5315
		e1000e_igp3_phy_powerdown_workaround_ich8lan(&adapter->hw);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5316
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5317
	/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5318
	 * Release control of h/w to f/w.  If f/w is AMT enabled, this
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5319
	 * would have already happened in close and is redundant.
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5320
	 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5321
	e1000_release_hw_control(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5322
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5323
	pci_disable_device(pdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5324
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5325
	return 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5326
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5327
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5328
static void e1000_power_off(struct pci_dev *pdev, bool sleep, bool wake)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5329
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5330
	if (sleep && wake) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5331
		pci_prepare_to_sleep(pdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5332
		return;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5333
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5334
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5335
	pci_wake_from_d3(pdev, wake);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5336
	pci_set_power_state(pdev, PCI_D3hot);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5337
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5338
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5339
static void e1000_complete_shutdown(struct pci_dev *pdev, bool sleep,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5340
                                    bool wake)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5341
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5342
	struct net_device *netdev = pci_get_drvdata(pdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5343
	struct e1000_adapter *adapter = netdev_priv(netdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5344
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5345
	/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5346
	 * The pci-e switch on some quad port adapters will report a
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5347
	 * correctable error when the MAC transitions from D0 to D3.  To
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5348
	 * prevent this we need to mask off the correctable errors on the
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5349
	 * downstream port of the pci-e switch.
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5350
	 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5351
	if (adapter->flags & FLAG_IS_QUAD_PORT) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5352
		struct pci_dev *us_dev = pdev->bus->self;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5353
		int pos = pci_find_capability(us_dev, PCI_CAP_ID_EXP);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5354
		u16 devctl;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5355
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5356
		pci_read_config_word(us_dev, pos + PCI_EXP_DEVCTL, &devctl);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5357
		pci_write_config_word(us_dev, pos + PCI_EXP_DEVCTL,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5358
		                      (devctl & ~PCI_EXP_DEVCTL_CERE));
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5359
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5360
		e1000_power_off(pdev, sleep, wake);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5361
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5362
		pci_write_config_word(us_dev, pos + PCI_EXP_DEVCTL, devctl);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5363
	} else {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5364
		e1000_power_off(pdev, sleep, wake);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5365
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5366
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5367
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5368
#ifdef CONFIG_PCIEASPM
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5369
static void __e1000e_disable_aspm(struct pci_dev *pdev, u16 state)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5370
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5371
	pci_disable_link_state(pdev, state);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5372
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5373
#else
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5374
static void __e1000e_disable_aspm(struct pci_dev *pdev, u16 state)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5375
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5376
	int pos;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5377
	u16 reg16;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5378
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5379
	/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5380
	 * Both device and parent should have the same ASPM setting.
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5381
	 * Disable ASPM in downstream component first and then upstream.
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5382
	 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5383
	pos = pci_pcie_cap(pdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5384
	pci_read_config_word(pdev, pos + PCI_EXP_LNKCTL, &reg16);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5385
	reg16 &= ~state;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5386
	pci_write_config_word(pdev, pos + PCI_EXP_LNKCTL, reg16);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5387
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5388
	if (!pdev->bus->self)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5389
		return;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5390
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5391
	pos = pci_pcie_cap(pdev->bus->self);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5392
	pci_read_config_word(pdev->bus->self, pos + PCI_EXP_LNKCTL, &reg16);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5393
	reg16 &= ~state;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5394
	pci_write_config_word(pdev->bus->self, pos + PCI_EXP_LNKCTL, reg16);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5395
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5396
#endif
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5397
void e1000e_disable_aspm(struct pci_dev *pdev, u16 state)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5398
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5399
	dev_info(&pdev->dev, "Disabling ASPM %s %s\n",
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5400
		 (state & PCIE_LINK_STATE_L0S) ? "L0s" : "",
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5401
		 (state & PCIE_LINK_STATE_L1) ? "L1" : "");
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5402
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5403
	__e1000e_disable_aspm(pdev, state);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5404
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5405
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5406
#ifdef CONFIG_PM_OPS
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5407
static bool e1000e_pm_ready(struct e1000_adapter *adapter)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5408
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5409
	return !!adapter->tx_ring->buffer_info;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5410
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5411
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5412
static int __e1000_resume(struct pci_dev *pdev)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5413
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5414
	struct net_device *netdev = pci_get_drvdata(pdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5415
	struct e1000_adapter *adapter = netdev_priv(netdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5416
	struct e1000_hw *hw = &adapter->hw;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5417
	u32 err;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5418
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5419
	if (adapter->ecdev)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5420
		return -EBUSY;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5421
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5422
	pci_set_power_state(pdev, PCI_D0);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5423
	pci_restore_state(pdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5424
	pci_save_state(pdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5425
	if (adapter->flags2 & FLAG2_DISABLE_ASPM_L1)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5426
		e1000e_disable_aspm(pdev, PCIE_LINK_STATE_L1);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5427
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5428
	e1000e_set_interrupt_capability(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5429
	if (netif_running(netdev)) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5430
		err = e1000_request_irq(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5431
		if (err)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5432
			return err;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5433
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5434
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5435
	e1000e_power_up_phy(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5436
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5437
	/* report the system wakeup cause from S3/S4 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5438
	if (adapter->flags2 & FLAG2_HAS_PHY_WAKEUP) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5439
		u16 phy_data;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5440
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5441
		e1e_rphy(&adapter->hw, BM_WUS, &phy_data);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5442
		if (phy_data) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5443
			e_info("PHY Wakeup cause - %s\n",
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5444
				phy_data & E1000_WUS_EX ? "Unicast Packet" :
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5445
				phy_data & E1000_WUS_MC ? "Multicast Packet" :
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5446
				phy_data & E1000_WUS_BC ? "Broadcast Packet" :
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5447
				phy_data & E1000_WUS_MAG ? "Magic Packet" :
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5448
				phy_data & E1000_WUS_LNKC ? "Link Status "
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5449
				" Change" : "other");
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5450
		}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5451
		e1e_wphy(&adapter->hw, BM_WUS, ~0);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5452
	} else {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5453
		u32 wus = er32(WUS);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5454
		if (wus) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5455
			e_info("MAC Wakeup cause - %s\n",
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5456
				wus & E1000_WUS_EX ? "Unicast Packet" :
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5457
				wus & E1000_WUS_MC ? "Multicast Packet" :
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5458
				wus & E1000_WUS_BC ? "Broadcast Packet" :
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5459
				wus & E1000_WUS_MAG ? "Magic Packet" :
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5460
				wus & E1000_WUS_LNKC ? "Link Status Change" :
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5461
				"other");
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5462
		}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5463
		ew32(WUS, ~0);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5464
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5465
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5466
	e1000e_reset(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5467
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5468
	e1000_init_manageability_pt(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5469
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5470
	if (netif_running(netdev))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5471
		e1000e_up(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5472
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5473
	netif_device_attach(netdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5474
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5475
	/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5476
	 * If the controller has AMT, do not set DRV_LOAD until the interface
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5477
	 * is up.  For all other cases, let the f/w know that the h/w is now
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5478
	 * under the control of the driver.
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5479
	 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5480
	if (!(adapter->flags & FLAG_HAS_AMT))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5481
		e1000_get_hw_control(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5482
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5483
	return 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5484
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5485
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5486
#ifdef CONFIG_PM_SLEEP
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5487
static int e1000_suspend(struct device *dev)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5488
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5489
	struct pci_dev *pdev = to_pci_dev(dev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5490
	int retval;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5491
	bool wake;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5492
	struct net_device *netdev = pci_get_drvdata(pdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5493
	struct e1000_adapter *adapter = netdev_priv(netdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5494
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5495
	if (adapter->ecdev)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5496
		return -EBUSY;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5497
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5498
	retval = __e1000_shutdown(pdev, &wake, false);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5499
	if (!retval)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5500
		e1000_complete_shutdown(pdev, true, wake);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5501
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5502
	return retval;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5503
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5504
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5505
static int e1000_resume(struct device *dev)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5506
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5507
	struct pci_dev *pdev = to_pci_dev(dev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5508
	struct net_device *netdev = pci_get_drvdata(pdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5509
	struct e1000_adapter *adapter = netdev_priv(netdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5510
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5511
	if (e1000e_pm_ready(adapter))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5512
		adapter->idle_check = true;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5513
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5514
	return __e1000_resume(pdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5515
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5516
#endif /* CONFIG_PM_SLEEP */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5517
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5518
#ifdef CONFIG_PM_RUNTIME
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5519
static int e1000_runtime_suspend(struct device *dev)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5520
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5521
	struct pci_dev *pdev = to_pci_dev(dev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5522
	struct net_device *netdev = pci_get_drvdata(pdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5523
	struct e1000_adapter *adapter = netdev_priv(netdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5524
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5525
	if (e1000e_pm_ready(adapter)) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5526
		bool wake;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5527
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5528
		__e1000_shutdown(pdev, &wake, true);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5529
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5530
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5531
	return 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5532
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5533
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5534
static int e1000_idle(struct device *dev)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5535
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5536
	struct pci_dev *pdev = to_pci_dev(dev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5537
	struct net_device *netdev = pci_get_drvdata(pdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5538
	struct e1000_adapter *adapter = netdev_priv(netdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5539
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5540
	if (!e1000e_pm_ready(adapter))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5541
		return 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5542
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5543
	if (adapter->idle_check) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5544
		adapter->idle_check = false;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5545
		if (!e1000e_has_link(adapter))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5546
			pm_schedule_suspend(dev, MSEC_PER_SEC);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5547
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5548
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5549
	return -EBUSY;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5550
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5551
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5552
static int e1000_runtime_resume(struct device *dev)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5553
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5554
	struct pci_dev *pdev = to_pci_dev(dev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5555
	struct net_device *netdev = pci_get_drvdata(pdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5556
	struct e1000_adapter *adapter = netdev_priv(netdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5557
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5558
	if (!e1000e_pm_ready(adapter))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5559
		return 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5560
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5561
	adapter->idle_check = !dev->power.runtime_auto;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5562
	return __e1000_resume(pdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5563
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5564
#endif /* CONFIG_PM_RUNTIME */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5565
#endif /* CONFIG_PM_OPS */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5566
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5567
static void e1000_shutdown(struct pci_dev *pdev)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5568
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5569
	bool wake = false;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5570
	struct net_device *netdev = pci_get_drvdata(pdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5571
	struct e1000_adapter *adapter = netdev_priv(netdev);
2421
bc2d4bf9cbe5 Removed trailing spaces.
Florian Pose <fp@igh-essen.com>
parents: 2234
diff changeset
  5572
2219
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5573
	if (adapter->ecdev)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5574
		return;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5575
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5576
	__e1000_shutdown(pdev, &wake, false);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5577
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5578
	if (system_state == SYSTEM_POWER_OFF)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5579
		e1000_complete_shutdown(pdev, false, wake);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5580
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5581
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5582
#ifdef CONFIG_NET_POLL_CONTROLLER
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5583
/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5584
 * Polling 'interrupt' - used by things like netconsole to send skbs
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5585
 * without having to re-enable interrupts. It's not called while
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5586
 * the interrupt routine is executing.
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5587
 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5588
static void e1000_netpoll(struct net_device *netdev)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5589
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5590
	struct e1000_adapter *adapter = netdev_priv(netdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5591
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5592
	disable_irq(adapter->pdev->irq);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5593
	e1000_intr(adapter->pdev->irq, netdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5594
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5595
	enable_irq(adapter->pdev->irq);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5596
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5597
#endif
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5598
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5599
/**
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5600
 * e1000_io_error_detected - called when PCI error is detected
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5601
 * @pdev: Pointer to PCI device
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5602
 * @state: The current pci connection state
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5603
 *
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5604
 * This function is called after a PCI bus error affecting
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5605
 * this device has been detected.
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5606
 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5607
static pci_ers_result_t e1000_io_error_detected(struct pci_dev *pdev,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5608
						pci_channel_state_t state)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5609
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5610
	struct net_device *netdev = pci_get_drvdata(pdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5611
	struct e1000_adapter *adapter = netdev_priv(netdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5612
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5613
	netif_device_detach(netdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5614
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5615
	if (state == pci_channel_io_perm_failure)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5616
		return PCI_ERS_RESULT_DISCONNECT;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5617
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5618
	if (netif_running(netdev))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5619
		e1000e_down(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5620
	pci_disable_device(pdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5621
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5622
	/* Request a slot slot reset. */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5623
	return PCI_ERS_RESULT_NEED_RESET;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5624
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5625
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5626
/**
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5627
 * e1000_io_slot_reset - called after the pci bus has been reset.
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5628
 * @pdev: Pointer to PCI device
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5629
 *
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5630
 * Restart the card from scratch, as if from a cold-boot. Implementation
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5631
 * resembles the first-half of the e1000_resume routine.
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5632
 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5633
static pci_ers_result_t e1000_io_slot_reset(struct pci_dev *pdev)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5634
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5635
	struct net_device *netdev = pci_get_drvdata(pdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5636
	struct e1000_adapter *adapter = netdev_priv(netdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5637
	struct e1000_hw *hw = &adapter->hw;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5638
	int err;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5639
	pci_ers_result_t result;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5640
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5641
	if (adapter->flags2 & FLAG2_DISABLE_ASPM_L1)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5642
		e1000e_disable_aspm(pdev, PCIE_LINK_STATE_L1);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5643
	err = pci_enable_device_mem(pdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5644
	if (err) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5645
		dev_err(&pdev->dev,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5646
			"Cannot re-enable PCI device after reset.\n");
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5647
		result = PCI_ERS_RESULT_DISCONNECT;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5648
	} else {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5649
		pci_set_master(pdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5650
		pdev->state_saved = true;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5651
		pci_restore_state(pdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5652
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5653
		pci_enable_wake(pdev, PCI_D3hot, 0);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5654
		pci_enable_wake(pdev, PCI_D3cold, 0);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5655
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5656
		e1000e_reset(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5657
		ew32(WUS, ~0);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5658
		result = PCI_ERS_RESULT_RECOVERED;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5659
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5660
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5661
	pci_cleanup_aer_uncorrect_error_status(pdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5662
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5663
	return result;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5664
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5665
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5666
/**
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5667
 * e1000_io_resume - called when traffic can start flowing again.
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5668
 * @pdev: Pointer to PCI device
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5669
 *
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5670
 * This callback is called when the error recovery driver tells us that
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5671
 * its OK to resume normal operation. Implementation resembles the
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5672
 * second-half of the e1000_resume routine.
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5673
 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5674
static void e1000_io_resume(struct pci_dev *pdev)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5675
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5676
	struct net_device *netdev = pci_get_drvdata(pdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5677
	struct e1000_adapter *adapter = netdev_priv(netdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5678
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5679
	e1000_init_manageability_pt(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5680
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5681
	if (netif_running(netdev)) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5682
		if (e1000e_up(adapter)) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5683
			dev_err(&pdev->dev,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5684
				"can't bring device back up after reset\n");
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5685
			return;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5686
		}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5687
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5688
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5689
	netif_device_attach(netdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5690
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5691
	/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5692
	 * If the controller has AMT, do not set DRV_LOAD until the interface
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5693
	 * is up.  For all other cases, let the f/w know that the h/w is now
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5694
	 * under the control of the driver.
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5695
	 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5696
	if (!(adapter->flags & FLAG_HAS_AMT))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5697
		e1000_get_hw_control(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5698
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5699
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5700
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5701
static void e1000_print_device_info(struct e1000_adapter *adapter)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5702
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5703
	struct e1000_hw *hw = &adapter->hw;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5704
	struct net_device *netdev = adapter->netdev;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5705
	u32 pba_num;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5706
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5707
	/* print bus type/speed/width info */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5708
	e_info("(PCI Express:2.5GB/s:%s) %pM\n",
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5709
	       /* bus width */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5710
	       ((hw->bus.width == e1000_bus_width_pcie_x4) ? "Width x4" :
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5711
	        "Width x1"),
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5712
	       /* MAC address */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5713
	       netdev->dev_addr);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5714
	e_info("Intel(R) PRO/%s Network Connection\n",
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5715
	       (hw->phy.type == e1000_phy_ife) ? "10/100" : "1000");
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5716
	e1000e_read_pba_num(hw, &pba_num);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5717
	e_info("MAC: %d, PHY: %d, PBA No: %06x-%03x\n",
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5718
	       hw->mac.type, hw->phy.type, (pba_num >> 8), (pba_num & 0xff));
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5719
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5720
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5721
static void e1000_eeprom_checks(struct e1000_adapter *adapter)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5722
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5723
	struct e1000_hw *hw = &adapter->hw;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5724
	int ret_val;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5725
	u16 buf = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5726
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5727
	if (hw->mac.type != e1000_82573)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5728
		return;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5729
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5730
	ret_val = e1000_read_nvm(hw, NVM_INIT_CONTROL2_REG, 1, &buf);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5731
	if (!ret_val && (!(le16_to_cpu(buf) & (1 << 0)))) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5732
		/* Deep Smart Power Down (DSPD) */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5733
		dev_warn(&adapter->pdev->dev,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5734
			 "Warning: detected DSPD enabled in EEPROM\n");
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5735
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5736
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5737
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5738
static const struct net_device_ops e1000e_netdev_ops = {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5739
	.ndo_open		= e1000_open,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5740
	.ndo_stop		= e1000_close,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5741
	.ndo_start_xmit		= e1000_xmit_frame,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5742
	.ndo_get_stats		= e1000_get_stats,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5743
	.ndo_set_multicast_list	= e1000_set_multi,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5744
	.ndo_set_mac_address	= e1000_set_mac,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5745
	.ndo_change_mtu		= e1000_change_mtu,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5746
	.ndo_do_ioctl		= e1000_ioctl,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5747
	.ndo_tx_timeout		= e1000_tx_timeout,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5748
	.ndo_validate_addr	= eth_validate_addr,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5749
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5750
	.ndo_vlan_rx_register	= e1000_vlan_rx_register,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5751
	.ndo_vlan_rx_add_vid	= e1000_vlan_rx_add_vid,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5752
	.ndo_vlan_rx_kill_vid	= e1000_vlan_rx_kill_vid,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5753
#ifdef CONFIG_NET_POLL_CONTROLLER
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5754
	.ndo_poll_controller	= e1000_netpoll,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5755
#endif
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5756
};
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5757
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5758
/**
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5759
 * ec_poll - Ethercat poll Routine
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5760
 * @netdev: net device structure
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5761
 *
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5762
 * This function can never fail.
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5763
 *
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5764
 **/
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5765
void ec_poll(struct net_device *netdev)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5766
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5767
	struct e1000_adapter *adapter = netdev_priv(netdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5768
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5769
	if (jiffies - adapter->ec_watchdog_jiffies >= 2 * HZ) {
2499
c350fc89afd7 Fixed link detection in older e1000e drivers.
Florian Pose <fp@igh-essen.com>
parents: 2473
diff changeset
  5770
		struct e1000_hw *hw = &adapter->hw;
c350fc89afd7 Fixed link detection in older e1000e drivers.
Florian Pose <fp@igh-essen.com>
parents: 2473
diff changeset
  5771
		hw->mac.get_link_status = true;
c350fc89afd7 Fixed link detection in older e1000e drivers.
Florian Pose <fp@igh-essen.com>
parents: 2473
diff changeset
  5772
		e1000_watchdog_task(&adapter->watchdog_task);
2219
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5773
		adapter->ec_watchdog_jiffies = jiffies;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5774
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5775
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5776
#ifdef CONFIG_PCI_MSI
2499
c350fc89afd7 Fixed link detection in older e1000e drivers.
Florian Pose <fp@igh-essen.com>
parents: 2473
diff changeset
  5777
	e1000_intr_msi(0, netdev);
2219
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5778
#else
2499
c350fc89afd7 Fixed link detection in older e1000e drivers.
Florian Pose <fp@igh-essen.com>
parents: 2473
diff changeset
  5779
	e1000_intr(0, netdev);
2219
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5780
#endif
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5781
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5782
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5783
/**
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5784
 * e1000_probe - Device Initialization Routine
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5785
 * @pdev: PCI device information struct
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5786
 * @ent: entry in e1000_pci_tbl
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5787
 *
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5788
 * Returns 0 on success, negative on failure
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5789
 *
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5790
 * e1000_probe initializes an adapter identified by a pci_dev structure.
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5791
 * The OS initialization, configuring of the adapter private structure,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5792
 * and a hardware reset occur.
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5793
 **/
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5794
static int __devinit e1000_probe(struct pci_dev *pdev,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5795
				 const struct pci_device_id *ent)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5796
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5797
	struct net_device *netdev;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5798
	struct e1000_adapter *adapter;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5799
	struct e1000_hw *hw;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5800
	const struct e1000_info *ei = e1000_info_tbl[ent->driver_data];
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5801
	resource_size_t mmio_start, mmio_len;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5802
	resource_size_t flash_start, flash_len;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5803
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5804
	static int cards_found;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5805
	int i, err, pci_using_dac;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5806
	u16 eeprom_data = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5807
	u16 eeprom_apme_mask = E1000_EEPROM_APME;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5808
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5809
	if (ei->flags2 & FLAG2_DISABLE_ASPM_L1)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5810
		e1000e_disable_aspm(pdev, PCIE_LINK_STATE_L1);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5811
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5812
	err = pci_enable_device_mem(pdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5813
	if (err)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5814
		return err;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5815
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5816
	pci_using_dac = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5817
	err = dma_set_mask(&pdev->dev, DMA_BIT_MASK(64));
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5818
	if (!err) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5819
		err = dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(64));
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5820
		if (!err)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5821
			pci_using_dac = 1;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5822
	} else {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5823
		err = dma_set_mask(&pdev->dev, DMA_BIT_MASK(32));
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5824
		if (err) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5825
			err = dma_set_coherent_mask(&pdev->dev,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5826
						    DMA_BIT_MASK(32));
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5827
			if (err) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5828
				dev_err(&pdev->dev, "No usable DMA "
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5829
					"configuration, aborting\n");
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5830
				goto err_dma;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5831
			}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5832
		}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5833
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5834
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5835
	err = pci_request_selected_regions_exclusive(pdev,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5836
	                                  pci_select_bars(pdev, IORESOURCE_MEM),
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5837
	                                  e1000e_driver_name);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5838
	if (err)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5839
		goto err_pci_reg;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5840
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5841
	/* AER (Advanced Error Reporting) hooks */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5842
	pci_enable_pcie_error_reporting(pdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5843
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5844
	pci_set_master(pdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5845
	/* PCI config space info */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5846
	err = pci_save_state(pdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5847
	if (err)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5848
		goto err_alloc_etherdev;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5849
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5850
	err = -ENOMEM;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5851
	netdev = alloc_etherdev(sizeof(struct e1000_adapter));
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5852
	if (!netdev)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5853
		goto err_alloc_etherdev;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5854
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5855
	SET_NETDEV_DEV(netdev, &pdev->dev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5856
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5857
	netdev->irq = pdev->irq;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5858
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5859
	pci_set_drvdata(pdev, netdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5860
	adapter = netdev_priv(netdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5861
	hw = &adapter->hw;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5862
	adapter->netdev = netdev;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5863
	adapter->pdev = pdev;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5864
	adapter->ei = ei;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5865
	adapter->pba = ei->pba;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5866
	adapter->flags = ei->flags;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5867
	adapter->flags2 = ei->flags2;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5868
	adapter->hw.adapter = adapter;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5869
	adapter->hw.mac.type = ei->mac;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5870
	adapter->max_hw_frame_size = ei->max_hw_frame_size;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5871
	adapter->msg_enable = (1 << NETIF_MSG_DRV | NETIF_MSG_PROBE) - 1;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5872
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5873
	mmio_start = pci_resource_start(pdev, 0);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5874
	mmio_len = pci_resource_len(pdev, 0);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5875
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5876
	err = -EIO;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5877
	adapter->hw.hw_addr = ioremap(mmio_start, mmio_len);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5878
	if (!adapter->hw.hw_addr)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5879
		goto err_ioremap;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5880
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5881
	if ((adapter->flags & FLAG_HAS_FLASH) &&
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5882
	    (pci_resource_flags(pdev, 1) & IORESOURCE_MEM)) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5883
		flash_start = pci_resource_start(pdev, 1);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5884
		flash_len = pci_resource_len(pdev, 1);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5885
		adapter->hw.flash_address = ioremap(flash_start, flash_len);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5886
		if (!adapter->hw.flash_address)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5887
			goto err_flashmap;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5888
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5889
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5890
	/* construct the net_device struct */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5891
	netdev->netdev_ops		= &e1000e_netdev_ops;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5892
	e1000e_set_ethtool_ops(netdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5893
	netdev->watchdog_timeo		= 5 * HZ;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5894
	netif_napi_add(netdev, &adapter->napi, e1000_clean, 64);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5895
	strncpy(netdev->name, pci_name(pdev), sizeof(netdev->name) - 1);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5896
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5897
	netdev->mem_start = mmio_start;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5898
	netdev->mem_end = mmio_start + mmio_len;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5899
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5900
	adapter->bd_number = cards_found++;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5901
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5902
	e1000e_check_options(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5903
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5904
	/* setup adapter struct */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5905
	err = e1000_sw_init(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5906
	if (err)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5907
		goto err_sw_init;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5908
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5909
	memcpy(&hw->mac.ops, ei->mac_ops, sizeof(hw->mac.ops));
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5910
	memcpy(&hw->nvm.ops, ei->nvm_ops, sizeof(hw->nvm.ops));
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5911
	memcpy(&hw->phy.ops, ei->phy_ops, sizeof(hw->phy.ops));
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5912
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5913
	err = ei->get_variants(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5914
	if (err)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5915
		goto err_hw_init;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5916
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5917
	if ((adapter->flags & FLAG_IS_ICH) &&
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5918
	    (adapter->flags & FLAG_READ_ONLY_NVM))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5919
		e1000e_write_protect_nvm_ich8lan(&adapter->hw);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5920
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5921
	hw->mac.ops.get_bus_info(&adapter->hw);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5922
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5923
	adapter->hw.phy.autoneg_wait_to_complete = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5924
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5925
	/* Copper options */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5926
	if (adapter->hw.phy.media_type == e1000_media_type_copper) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5927
		adapter->hw.phy.mdix = AUTO_ALL_MODES;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5928
		adapter->hw.phy.disable_polarity_correction = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5929
		adapter->hw.phy.ms_type = e1000_ms_hw_default;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5930
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5931
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5932
	if (e1000_check_reset_block(&adapter->hw))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5933
		e_info("PHY reset is blocked due to SOL/IDER session.\n");
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5934
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5935
	netdev->features = NETIF_F_SG |
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5936
			   NETIF_F_HW_CSUM |
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5937
			   NETIF_F_HW_VLAN_TX |
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5938
			   NETIF_F_HW_VLAN_RX;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5939
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5940
	if (adapter->flags & FLAG_HAS_HW_VLAN_FILTER)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5941
		netdev->features |= NETIF_F_HW_VLAN_FILTER;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5942
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5943
	netdev->features |= NETIF_F_TSO;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5944
	netdev->features |= NETIF_F_TSO6;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5945
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5946
	netdev->vlan_features |= NETIF_F_TSO;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5947
	netdev->vlan_features |= NETIF_F_TSO6;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5948
	netdev->vlan_features |= NETIF_F_HW_CSUM;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5949
	netdev->vlan_features |= NETIF_F_SG;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5950
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5951
	if (pci_using_dac) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5952
		netdev->features |= NETIF_F_HIGHDMA;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5953
		netdev->vlan_features |= NETIF_F_HIGHDMA;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5954
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5955
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5956
	if (e1000e_enable_mng_pass_thru(&adapter->hw))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5957
		adapter->flags |= FLAG_MNG_PT_ENABLED;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5958
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5959
	/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5960
	 * before reading the NVM, reset the controller to
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5961
	 * put the device in a known good starting state
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5962
	 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5963
	adapter->hw.mac.ops.reset_hw(&adapter->hw);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5964
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5965
	/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5966
	 * systems with ASPM and others may see the checksum fail on the first
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5967
	 * attempt. Let's give it a few tries
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5968
	 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5969
	for (i = 0;; i++) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5970
		if (e1000_validate_nvm_checksum(&adapter->hw) >= 0)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5971
			break;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5972
		if (i == 2) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5973
			e_err("The NVM Checksum Is Not Valid\n");
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5974
			err = -EIO;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5975
			goto err_eeprom;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5976
		}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5977
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5978
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5979
	e1000_eeprom_checks(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5980
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5981
	/* copy the MAC address */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5982
	if (e1000e_read_mac_addr(&adapter->hw))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5983
		e_err("NVM Read Error while reading MAC address\n");
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5984
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5985
	memcpy(netdev->dev_addr, adapter->hw.mac.addr, netdev->addr_len);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5986
	memcpy(netdev->perm_addr, adapter->hw.mac.addr, netdev->addr_len);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5987
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5988
	if (!is_valid_ether_addr(netdev->perm_addr)) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5989
		e_err("Invalid MAC Address: %pM\n", netdev->perm_addr);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5990
		err = -EIO;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5991
		goto err_eeprom;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5992
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5993
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5994
	init_timer(&adapter->watchdog_timer);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5995
	adapter->watchdog_timer.function = e1000_watchdog;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5996
	adapter->watchdog_timer.data = (unsigned long) adapter;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5997
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5998
	init_timer(&adapter->phy_info_timer);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5999
	adapter->phy_info_timer.function = e1000_update_phy_info;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6000
	adapter->phy_info_timer.data = (unsigned long) adapter;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6001
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6002
	INIT_WORK(&adapter->reset_task, e1000_reset_task);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6003
	INIT_WORK(&adapter->watchdog_task, e1000_watchdog_task);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6004
	INIT_WORK(&adapter->downshift_task, e1000e_downshift_workaround);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6005
	INIT_WORK(&adapter->update_phy_task, e1000e_update_phy_task);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6006
	INIT_WORK(&adapter->print_hang_task, e1000_print_hw_hang);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6007
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6008
	/* Initialize link parameters. User can change them with ethtool */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6009
	adapter->hw.mac.autoneg = 1;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6010
	adapter->fc_autoneg = 1;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6011
	adapter->hw.fc.requested_mode = e1000_fc_default;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6012
	adapter->hw.fc.current_mode = e1000_fc_default;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6013
	adapter->hw.phy.autoneg_advertised = 0x2f;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6014
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6015
	/* ring size defaults */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6016
	adapter->rx_ring->count = 256;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6017
	adapter->tx_ring->count = 256;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6018
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6019
	/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6020
	 * Initial Wake on LAN setting - If APM wake is enabled in
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6021
	 * the EEPROM, enable the ACPI Magic Packet filter
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6022
	 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6023
	if (adapter->flags & FLAG_APME_IN_WUC) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6024
		/* APME bit in EEPROM is mapped to WUC.APME */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6025
		eeprom_data = er32(WUC);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6026
		eeprom_apme_mask = E1000_WUC_APME;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6027
		if ((hw->mac.type > e1000_ich10lan) &&
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6028
		    (eeprom_data & E1000_WUC_PHY_WAKE))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6029
			adapter->flags2 |= FLAG2_HAS_PHY_WAKEUP;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6030
	} else if (adapter->flags & FLAG_APME_IN_CTRL3) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6031
		if (adapter->flags & FLAG_APME_CHECK_PORT_B &&
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6032
		    (adapter->hw.bus.func == 1))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6033
			e1000_read_nvm(&adapter->hw,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6034
				NVM_INIT_CONTROL3_PORT_B, 1, &eeprom_data);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6035
		else
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6036
			e1000_read_nvm(&adapter->hw,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6037
				NVM_INIT_CONTROL3_PORT_A, 1, &eeprom_data);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6038
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6039
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6040
	/* fetch WoL from EEPROM */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6041
	if (eeprom_data & eeprom_apme_mask)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6042
		adapter->eeprom_wol |= E1000_WUFC_MAG;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6043
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6044
	/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6045
	 * now that we have the eeprom settings, apply the special cases
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6046
	 * where the eeprom may be wrong or the board simply won't support
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6047
	 * wake on lan on a particular port
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6048
	 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6049
	if (!(adapter->flags & FLAG_HAS_WOL))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6050
		adapter->eeprom_wol = 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6051
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6052
	/* initialize the wol settings based on the eeprom settings */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6053
	adapter->wol = adapter->eeprom_wol;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6054
	device_set_wakeup_enable(&adapter->pdev->dev, adapter->wol);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6055
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6056
	/* save off EEPROM version number */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6057
	e1000_read_nvm(&adapter->hw, 5, 1, &adapter->eeprom_vers);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6058
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6059
	/* reset the hardware with the new settings */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6060
	e1000e_reset(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6061
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6062
	/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6063
	 * If the controller has AMT, do not set DRV_LOAD until the interface
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6064
	 * is up.  For all other cases, let the f/w know that the h/w is now
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6065
	 * under the control of the driver.
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6066
	 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6067
	if (!(adapter->flags & FLAG_HAS_AMT))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6068
		e1000_get_hw_control(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6069
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6070
	adapter->ecdev = ecdev_offer(netdev, ec_poll, THIS_MODULE);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6071
	if (adapter->ecdev) {
2582
87e502828b3f Use return value of ecdev_open(); thanks to Patrick Bruenn.
Florian Pose <fp@igh-essen.com>
parents: 2500
diff changeset
  6072
		err = ecdev_open(adapter->ecdev);
87e502828b3f Use return value of ecdev_open(); thanks to Patrick Bruenn.
Florian Pose <fp@igh-essen.com>
parents: 2500
diff changeset
  6073
		if (err) {
2219
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6074
			ecdev_withdraw(adapter->ecdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6075
			goto err_register;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6076
		}
2582
87e502828b3f Use return value of ecdev_open(); thanks to Patrick Bruenn.
Florian Pose <fp@igh-essen.com>
parents: 2500
diff changeset
  6077
		adapter->ec_watchdog_jiffies = jiffies;
2219
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6078
	} else {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6079
		strcpy(netdev->name, "eth%d");
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6080
		err = register_netdev(netdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6081
		if (err)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6082
			goto err_register;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6083
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6084
		/* carrier off reporting is important to ethtool even BEFORE open */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6085
		netif_carrier_off(netdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6086
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6087
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6088
	e1000_print_device_info(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6089
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6090
	if (pci_dev_run_wake(pdev))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6091
		pm_runtime_put_noidle(&pdev->dev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6092
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6093
	return 0;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6094
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6095
err_register:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6096
	if (!(adapter->flags & FLAG_HAS_AMT))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6097
		e1000_release_hw_control(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6098
err_eeprom:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6099
	if (!e1000_check_reset_block(&adapter->hw))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6100
		e1000_phy_hw_reset(&adapter->hw);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6101
err_hw_init:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6102
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6103
	kfree(adapter->tx_ring);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6104
	kfree(adapter->rx_ring);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6105
err_sw_init:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6106
	if (adapter->hw.flash_address)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6107
		iounmap(adapter->hw.flash_address);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6108
	e1000e_reset_interrupt_capability(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6109
err_flashmap:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6110
	iounmap(adapter->hw.hw_addr);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6111
err_ioremap:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6112
	free_netdev(netdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6113
err_alloc_etherdev:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6114
	pci_release_selected_regions(pdev,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6115
	                             pci_select_bars(pdev, IORESOURCE_MEM));
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6116
err_pci_reg:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6117
err_dma:
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6118
	pci_disable_device(pdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6119
	return err;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6120
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6121
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6122
/**
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6123
 * e1000_remove - Device Removal Routine
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6124
 * @pdev: PCI device information struct
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6125
 *
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6126
 * e1000_remove is called by the PCI subsystem to alert the driver
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6127
 * that it should release a PCI device.  The could be caused by a
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6128
 * Hot-Plug event, or because the driver is going to be removed from
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6129
 * memory.
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6130
 **/
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6131
static void __devexit e1000_remove(struct pci_dev *pdev)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6132
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6133
	struct net_device *netdev = pci_get_drvdata(pdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6134
	struct e1000_adapter *adapter = netdev_priv(netdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6135
	bool down = test_bit(__E1000_DOWN, &adapter->state);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6136
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6137
	/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6138
	 * flush_scheduled work may reschedule our watchdog task, so
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6139
	 * explicitly disable watchdog tasks from being rescheduled
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6140
	 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6141
	if (!down)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6142
		set_bit(__E1000_DOWN, &adapter->state);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6143
	del_timer_sync(&adapter->watchdog_timer);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6144
	del_timer_sync(&adapter->phy_info_timer);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6145
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6146
	cancel_work_sync(&adapter->reset_task);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6147
	cancel_work_sync(&adapter->watchdog_task);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6148
	cancel_work_sync(&adapter->downshift_task);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6149
	cancel_work_sync(&adapter->update_phy_task);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6150
	cancel_work_sync(&adapter->print_hang_task);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6151
	flush_scheduled_work();
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6152
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6153
	if (!(netdev->flags & IFF_UP))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6154
		e1000_power_down_phy(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6155
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6156
	/* Don't lie to e1000_close() down the road. */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6157
	if (!down)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6158
		clear_bit(__E1000_DOWN, &adapter->state);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6159
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6160
	if (adapter->ecdev) {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6161
		ecdev_close(adapter->ecdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6162
		ecdev_withdraw(adapter->ecdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6163
	} else {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6164
		unregister_netdev(netdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6165
	}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6166
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6167
	if (pci_dev_run_wake(pdev))
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6168
		pm_runtime_get_noresume(&pdev->dev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6169
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6170
	/*
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6171
	 * Release control of h/w to f/w.  If f/w is AMT enabled, this
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6172
	 * would have already happened in close and is redundant.
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6173
	 */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6174
	e1000_release_hw_control(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6175
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6176
	e1000e_reset_interrupt_capability(adapter);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6177
	kfree(adapter->tx_ring);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6178
	kfree(adapter->rx_ring);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6179
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6180
	iounmap(adapter->hw.hw_addr);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6181
	if (adapter->hw.flash_address)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6182
		iounmap(adapter->hw.flash_address);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6183
	pci_release_selected_regions(pdev,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6184
	                             pci_select_bars(pdev, IORESOURCE_MEM));
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6185
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6186
	free_netdev(netdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6187
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6188
	/* AER disable */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6189
	pci_disable_pcie_error_reporting(pdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6190
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6191
	pci_disable_device(pdev);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6192
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6193
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6194
/* PCI Error Recovery (ERS) */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6195
static struct pci_error_handlers e1000_err_handler = {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6196
	.error_detected = e1000_io_error_detected,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6197
	.slot_reset = e1000_io_slot_reset,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6198
	.resume = e1000_io_resume,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6199
};
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6200
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6201
static DEFINE_PCI_DEVICE_TABLE(e1000_pci_tbl) = {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6202
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82571EB_COPPER), board_82571 },
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6203
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82571EB_FIBER), board_82571 },
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6204
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82571EB_QUAD_COPPER), board_82571 },
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6205
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82571EB_QUAD_COPPER_LP), board_82571 },
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6206
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82571EB_QUAD_FIBER), board_82571 },
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6207
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82571EB_SERDES), board_82571 },
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6208
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82571EB_SERDES_DUAL), board_82571 },
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6209
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82571EB_SERDES_QUAD), board_82571 },
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6210
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82571PT_QUAD_COPPER), board_82571 },
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6211
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6212
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82572EI), board_82572 },
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6213
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82572EI_COPPER), board_82572 },
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6214
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82572EI_FIBER), board_82572 },
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6215
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82572EI_SERDES), board_82572 },
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6216
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6217
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82573E), board_82573 },
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6218
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82573E_IAMT), board_82573 },
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6219
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82573L), board_82573 },
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6220
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6221
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82574L), board_82574 },
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6222
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82574LA), board_82574 },
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6223
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82583V), board_82583 },
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6224
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6225
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_80003ES2LAN_COPPER_DPT),
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6226
	  board_80003es2lan },
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6227
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_80003ES2LAN_COPPER_SPT),
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6228
	  board_80003es2lan },
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6229
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_80003ES2LAN_SERDES_DPT),
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6230
	  board_80003es2lan },
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6231
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_80003ES2LAN_SERDES_SPT),
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6232
	  board_80003es2lan },
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6233
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6234
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH8_IFE), board_ich8lan },
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6235
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH8_IFE_G), board_ich8lan },
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6236
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH8_IFE_GT), board_ich8lan },
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6237
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH8_IGP_AMT), board_ich8lan },
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6238
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH8_IGP_C), board_ich8lan },
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6239
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH8_IGP_M), board_ich8lan },
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6240
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH8_IGP_M_AMT), board_ich8lan },
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6241
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH8_82567V_3), board_ich8lan },
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6242
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6243
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH9_IFE), board_ich9lan },
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6244
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH9_IFE_G), board_ich9lan },
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6245
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH9_IFE_GT), board_ich9lan },
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6246
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH9_IGP_AMT), board_ich9lan },
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6247
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH9_IGP_C), board_ich9lan },
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6248
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH9_BM), board_ich9lan },
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6249
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH9_IGP_M), board_ich9lan },
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6250
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH9_IGP_M_AMT), board_ich9lan },
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6251
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH9_IGP_M_V), board_ich9lan },
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6252
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6253
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH10_R_BM_LM), board_ich9lan },
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6254
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH10_R_BM_LF), board_ich9lan },
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6255
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH10_R_BM_V), board_ich9lan },
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6256
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6257
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH10_D_BM_LM), board_ich10lan },
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6258
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH10_D_BM_LF), board_ich10lan },
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6259
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH10_D_BM_V), board_ich10lan },
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6260
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6261
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH_M_HV_LM), board_pchlan },
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6262
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH_M_HV_LC), board_pchlan },
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6263
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH_D_HV_DM), board_pchlan },
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6264
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH_D_HV_DC), board_pchlan },
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6265
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6266
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH2_LV_LM), board_pch2lan },
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6267
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH2_LV_V), board_pch2lan },
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6268
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6269
	{ }	/* terminate list */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6270
};
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6271
//MODULE_DEVICE_TABLE(pci, e1000_pci_tbl);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6272
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6273
#ifdef CONFIG_PM_OPS
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6274
static const struct dev_pm_ops e1000_pm_ops = {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6275
	SET_SYSTEM_SLEEP_PM_OPS(e1000_suspend, e1000_resume)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6276
	SET_RUNTIME_PM_OPS(e1000_runtime_suspend,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6277
				e1000_runtime_resume, e1000_idle)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6278
};
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6279
#endif
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6280
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6281
/* PCI Device API Driver */
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6282
static struct pci_driver e1000_driver = {
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6283
	.name     = e1000e_driver_name,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6284
	.id_table = e1000_pci_tbl,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6285
	.probe    = e1000_probe,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6286
	.remove   = __devexit_p(e1000_remove),
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6287
#ifdef CONFIG_PM_OPS
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6288
	.driver.pm = &e1000_pm_ops,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6289
#endif
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6290
	.shutdown = e1000_shutdown,
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6291
	.err_handler = &e1000_err_handler
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6292
};
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6293
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6294
/**
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6295
 * e1000_init_module - Driver Registration Routine
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6296
 *
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6297
 * e1000_init_module is the first routine called when the driver is
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6298
 * loaded. All it does is register with the PCI subsystem.
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6299
 **/
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6300
static int __init e1000_init_module(void)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6301
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6302
	int ret;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6303
	pr_info("EtherCAT-capable Intel(R) PRO/1000 Network Driver - %s\n",
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6304
		e1000e_driver_version);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6305
	pr_info("Copyright (c) 1999 - 2010 Intel Corporation.\n");
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6306
	ret = pci_register_driver(&e1000_driver);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6307
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6308
	return ret;
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6309
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6310
module_init(e1000_init_module);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6311
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6312
/**
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6313
 * e1000_exit_module - Driver Exit Cleanup Routine
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6314
 *
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6315
 * e1000_exit_module is called just before the driver is removed
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6316
 * from memory.
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6317
 **/
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6318
static void __exit e1000_exit_module(void)
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6319
{
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6320
	pci_unregister_driver(&e1000_driver);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6321
}
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6322
module_exit(e1000_exit_module);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6323
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6324
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6325
MODULE_AUTHOR("Intel Corporation, <linux.nics@intel.com>");
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6326
MODULE_DESCRIPTION("Ethercat-capable Intel(R) PRO/1000 Network Driver");
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6327
MODULE_LICENSE("GPL");
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6328
MODULE_VERSION(DRV_VERSION);
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6329
d52848f0be04 Added e1000e driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6330
/* e1000_main.c */