devices/e1000e/netdev-2.6.35-orig.c
author Gavin Lambert <gavinl@compacsort.com>
Tue, 14 Apr 2015 09:33:24 -0400
changeset 2618 3affe9cd0b66
parent 2285 8ebecea534d3
permissions -rw-r--r--
Ignore NXIO error otherwise this causes spam if network is empty or refclk not
selected yet, and syncing refclk time to master.
2285
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     1
/*******************************************************************************
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     2
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     3
  Intel PRO/1000 Linux driver
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     4
  Copyright(c) 1999 - 2009 Intel Corporation.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     5
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     6
  This program is free software; you can redistribute it and/or modify it
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     7
  under the terms and conditions of the GNU General Public License,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     8
  version 2, as published by the Free Software Foundation.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     9
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    10
  This program is distributed in the hope it will be useful, but WITHOUT
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    11
  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    12
  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    13
  more details.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    14
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    15
  You should have received a copy of the GNU General Public License along with
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    16
  this program; if not, write to the Free Software Foundation, Inc.,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    17
  51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    18
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    19
  The full GNU General Public License is included in this distribution in
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    20
  the file called "COPYING".
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    21
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    22
  Contact Information:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    23
  Linux NICS <linux.nics@intel.com>
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    24
  e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    25
  Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    26
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    27
*******************************************************************************/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    28
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    29
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    30
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    31
#include <linux/module.h>
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    32
#include <linux/types.h>
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    33
#include <linux/init.h>
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    34
#include <linux/pci.h>
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    35
#include <linux/vmalloc.h>
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    36
#include <linux/pagemap.h>
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    37
#include <linux/delay.h>
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    38
#include <linux/netdevice.h>
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    39
#include <linux/tcp.h>
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    40
#include <linux/ipv6.h>
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    41
#include <linux/slab.h>
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    42
#include <net/checksum.h>
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    43
#include <net/ip6_checksum.h>
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    44
#include <linux/mii.h>
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    45
#include <linux/ethtool.h>
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    46
#include <linux/if_vlan.h>
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    47
#include <linux/cpu.h>
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    48
#include <linux/smp.h>
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    49
#include <linux/pm_qos_params.h>
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    50
#include <linux/pm_runtime.h>
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    51
#include <linux/aer.h>
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    52
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    53
#include "e1000.h"
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    54
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    55
#define DRV_VERSION "1.0.2-k4"
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    56
char e1000e_driver_name[] = "e1000e";
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    57
const char e1000e_driver_version[] = DRV_VERSION;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    58
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    59
static const struct e1000_info *e1000_info_tbl[] = {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    60
	[board_82571]		= &e1000_82571_info,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    61
	[board_82572]		= &e1000_82572_info,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    62
	[board_82573]		= &e1000_82573_info,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    63
	[board_82574]		= &e1000_82574_info,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    64
	[board_82583]		= &e1000_82583_info,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    65
	[board_80003es2lan]	= &e1000_es2_info,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    66
	[board_ich8lan]		= &e1000_ich8_info,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    67
	[board_ich9lan]		= &e1000_ich9_info,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    68
	[board_ich10lan]	= &e1000_ich10_info,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    69
	[board_pchlan]		= &e1000_pch_info,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    70
};
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    71
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    72
struct e1000_reg_info {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    73
	u32 ofs;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    74
	char *name;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    75
};
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    76
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    77
#define E1000_RDFH	0x02410 /* Rx Data FIFO Head - RW */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    78
#define E1000_RDFT	0x02418 /* Rx Data FIFO Tail - RW */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    79
#define E1000_RDFHS	0x02420 /* Rx Data FIFO Head Saved - RW */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    80
#define E1000_RDFTS	0x02428 /* Rx Data FIFO Tail Saved - RW */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    81
#define E1000_RDFPC	0x02430 /* Rx Data FIFO Packet Count - RW */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    82
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    83
#define E1000_TDFH	0x03410 /* Tx Data FIFO Head - RW */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    84
#define E1000_TDFT	0x03418 /* Tx Data FIFO Tail - RW */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    85
#define E1000_TDFHS	0x03420 /* Tx Data FIFO Head Saved - RW */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    86
#define E1000_TDFTS	0x03428 /* Tx Data FIFO Tail Saved - RW */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    87
#define E1000_TDFPC	0x03430 /* Tx Data FIFO Packet Count - RW */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    88
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    89
static const struct e1000_reg_info e1000_reg_info_tbl[] = {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    90
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    91
	/* General Registers */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    92
	{E1000_CTRL, "CTRL"},
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    93
	{E1000_STATUS, "STATUS"},
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    94
	{E1000_CTRL_EXT, "CTRL_EXT"},
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    95
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    96
	/* Interrupt Registers */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    97
	{E1000_ICR, "ICR"},
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    98
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    99
	/* RX Registers */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   100
	{E1000_RCTL, "RCTL"},
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   101
	{E1000_RDLEN, "RDLEN"},
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   102
	{E1000_RDH, "RDH"},
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   103
	{E1000_RDT, "RDT"},
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   104
	{E1000_RDTR, "RDTR"},
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   105
	{E1000_RXDCTL(0), "RXDCTL"},
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   106
	{E1000_ERT, "ERT"},
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   107
	{E1000_RDBAL, "RDBAL"},
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   108
	{E1000_RDBAH, "RDBAH"},
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   109
	{E1000_RDFH, "RDFH"},
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   110
	{E1000_RDFT, "RDFT"},
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   111
	{E1000_RDFHS, "RDFHS"},
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   112
	{E1000_RDFTS, "RDFTS"},
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   113
	{E1000_RDFPC, "RDFPC"},
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   114
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   115
	/* TX Registers */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   116
	{E1000_TCTL, "TCTL"},
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   117
	{E1000_TDBAL, "TDBAL"},
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   118
	{E1000_TDBAH, "TDBAH"},
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   119
	{E1000_TDLEN, "TDLEN"},
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   120
	{E1000_TDH, "TDH"},
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   121
	{E1000_TDT, "TDT"},
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   122
	{E1000_TIDV, "TIDV"},
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   123
	{E1000_TXDCTL(0), "TXDCTL"},
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   124
	{E1000_TADV, "TADV"},
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   125
	{E1000_TARC(0), "TARC"},
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   126
	{E1000_TDFH, "TDFH"},
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   127
	{E1000_TDFT, "TDFT"},
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   128
	{E1000_TDFHS, "TDFHS"},
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   129
	{E1000_TDFTS, "TDFTS"},
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   130
	{E1000_TDFPC, "TDFPC"},
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   131
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   132
	/* List Terminator */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   133
	{}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   134
};
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   135
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   136
/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   137
 * e1000_regdump - register printout routine
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   138
 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   139
static void e1000_regdump(struct e1000_hw *hw, struct e1000_reg_info *reginfo)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   140
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   141
	int n = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   142
	char rname[16];
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   143
	u32 regs[8];
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   144
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   145
	switch (reginfo->ofs) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   146
	case E1000_RXDCTL(0):
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   147
		for (n = 0; n < 2; n++)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   148
			regs[n] = __er32(hw, E1000_RXDCTL(n));
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   149
		break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   150
	case E1000_TXDCTL(0):
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   151
		for (n = 0; n < 2; n++)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   152
			regs[n] = __er32(hw, E1000_TXDCTL(n));
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   153
		break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   154
	case E1000_TARC(0):
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   155
		for (n = 0; n < 2; n++)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   156
			regs[n] = __er32(hw, E1000_TARC(n));
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   157
		break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   158
	default:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   159
		printk(KERN_INFO "%-15s %08x\n",
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   160
			reginfo->name, __er32(hw, reginfo->ofs));
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   161
		return;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   162
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   163
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   164
	snprintf(rname, 16, "%s%s", reginfo->name, "[0-1]");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   165
	printk(KERN_INFO "%-15s ", rname);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   166
	for (n = 0; n < 2; n++)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   167
		printk(KERN_CONT "%08x ", regs[n]);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   168
	printk(KERN_CONT "\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   169
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   170
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   171
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   172
/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   173
 * e1000e_dump - Print registers, tx-ring and rx-ring
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   174
 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   175
static void e1000e_dump(struct e1000_adapter *adapter)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   176
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   177
	struct net_device *netdev = adapter->netdev;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   178
	struct e1000_hw *hw = &adapter->hw;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   179
	struct e1000_reg_info *reginfo;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   180
	struct e1000_ring *tx_ring = adapter->tx_ring;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   181
	struct e1000_tx_desc *tx_desc;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   182
	struct my_u0 { u64 a; u64 b; } *u0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   183
	struct e1000_buffer *buffer_info;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   184
	struct e1000_ring *rx_ring = adapter->rx_ring;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   185
	union e1000_rx_desc_packet_split *rx_desc_ps;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   186
	struct e1000_rx_desc *rx_desc;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   187
	struct my_u1 { u64 a; u64 b; u64 c; u64 d; } *u1;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   188
	u32 staterr;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   189
	int i = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   190
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   191
	if (!netif_msg_hw(adapter))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   192
		return;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   193
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   194
	/* Print netdevice Info */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   195
	if (netdev) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   196
		dev_info(&adapter->pdev->dev, "Net device Info\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   197
		printk(KERN_INFO "Device Name     state            "
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   198
			"trans_start      last_rx\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   199
		printk(KERN_INFO "%-15s %016lX %016lX %016lX\n",
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   200
			netdev->name,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   201
			netdev->state,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   202
			netdev->trans_start,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   203
			netdev->last_rx);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   204
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   205
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   206
	/* Print Registers */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   207
	dev_info(&adapter->pdev->dev, "Register Dump\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   208
	printk(KERN_INFO " Register Name   Value\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   209
	for (reginfo = (struct e1000_reg_info *)e1000_reg_info_tbl;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   210
	     reginfo->name; reginfo++) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   211
		e1000_regdump(hw, reginfo);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   212
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   213
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   214
	/* Print TX Ring Summary */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   215
	if (!netdev || !netif_running(netdev))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   216
		goto exit;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   217
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   218
	dev_info(&adapter->pdev->dev, "TX Rings Summary\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   219
	printk(KERN_INFO "Queue [NTU] [NTC] [bi(ntc)->dma  ]"
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   220
		" leng ntw timestamp\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   221
	buffer_info = &tx_ring->buffer_info[tx_ring->next_to_clean];
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   222
	printk(KERN_INFO " %5d %5X %5X %016llX %04X %3X %016llX\n",
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   223
		0, tx_ring->next_to_use, tx_ring->next_to_clean,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   224
		(u64)buffer_info->dma,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   225
		buffer_info->length,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   226
		buffer_info->next_to_watch,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   227
		(u64)buffer_info->time_stamp);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   228
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   229
	/* Print TX Rings */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   230
	if (!netif_msg_tx_done(adapter))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   231
		goto rx_ring_summary;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   232
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   233
	dev_info(&adapter->pdev->dev, "TX Rings Dump\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   234
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   235
	/* Transmit Descriptor Formats - DEXT[29] is 0 (Legacy) or 1 (Extended)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   236
	 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   237
	 * Legacy Transmit Descriptor
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   238
	 *   +--------------------------------------------------------------+
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   239
	 * 0 |         Buffer Address [63:0] (Reserved on Write Back)       |
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   240
	 *   +--------------------------------------------------------------+
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   241
	 * 8 | Special  |    CSS     | Status |  CMD    |  CSO   |  Length  |
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   242
	 *   +--------------------------------------------------------------+
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   243
	 *   63       48 47        36 35    32 31     24 23    16 15        0
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   244
	 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   245
	 * Extended Context Descriptor (DTYP=0x0) for TSO or checksum offload
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   246
	 *   63      48 47    40 39       32 31             16 15    8 7      0
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   247
	 *   +----------------------------------------------------------------+
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   248
	 * 0 |  TUCSE  | TUCS0  |   TUCSS   |     IPCSE       | IPCS0 | IPCSS |
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   249
	 *   +----------------------------------------------------------------+
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   250
	 * 8 |   MSS   | HDRLEN | RSV | STA | TUCMD | DTYP |      PAYLEN      |
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   251
	 *   +----------------------------------------------------------------+
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   252
	 *   63      48 47    40 39 36 35 32 31   24 23  20 19                0
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   253
	 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   254
	 * Extended Data Descriptor (DTYP=0x1)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   255
	 *   +----------------------------------------------------------------+
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   256
	 * 0 |                     Buffer Address [63:0]                      |
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   257
	 *   +----------------------------------------------------------------+
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   258
	 * 8 | VLAN tag |  POPTS  | Rsvd | Status | Command | DTYP |  DTALEN  |
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   259
	 *   +----------------------------------------------------------------+
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   260
	 *   63       48 47     40 39  36 35    32 31     24 23  20 19        0
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   261
	 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   262
	printk(KERN_INFO "Tl[desc]     [address 63:0  ] [SpeCssSCmCsLen]"
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   263
		" [bi->dma       ] leng  ntw timestamp        bi->skb "
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   264
		"<-- Legacy format\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   265
	printk(KERN_INFO "Tc[desc]     [Ce CoCsIpceCoS] [MssHlRSCm0Plen]"
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   266
		" [bi->dma       ] leng  ntw timestamp        bi->skb "
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   267
		"<-- Ext Context format\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   268
	printk(KERN_INFO "Td[desc]     [address 63:0  ] [VlaPoRSCm1Dlen]"
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   269
		" [bi->dma       ] leng  ntw timestamp        bi->skb "
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   270
		"<-- Ext Data format\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   271
	for (i = 0; tx_ring->desc && (i < tx_ring->count); i++) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   272
		tx_desc = E1000_TX_DESC(*tx_ring, i);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   273
		buffer_info = &tx_ring->buffer_info[i];
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   274
		u0 = (struct my_u0 *)tx_desc;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   275
		printk(KERN_INFO "T%c[0x%03X]    %016llX %016llX %016llX "
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   276
			"%04X  %3X %016llX %p",
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   277
		       (!(le64_to_cpu(u0->b) & (1<<29)) ? 'l' :
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   278
			((le64_to_cpu(u0->b) & (1<<20)) ? 'd' : 'c')), i,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   279
		       le64_to_cpu(u0->a), le64_to_cpu(u0->b),
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   280
		       (u64)buffer_info->dma, buffer_info->length,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   281
		       buffer_info->next_to_watch, (u64)buffer_info->time_stamp,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   282
		       buffer_info->skb);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   283
		if (i == tx_ring->next_to_use && i == tx_ring->next_to_clean)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   284
			printk(KERN_CONT " NTC/U\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   285
		else if (i == tx_ring->next_to_use)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   286
			printk(KERN_CONT " NTU\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   287
		else if (i == tx_ring->next_to_clean)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   288
			printk(KERN_CONT " NTC\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   289
		else
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   290
			printk(KERN_CONT "\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   291
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   292
		if (netif_msg_pktdata(adapter) && buffer_info->dma != 0)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   293
			print_hex_dump(KERN_INFO, "", DUMP_PREFIX_ADDRESS,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   294
					16, 1, phys_to_virt(buffer_info->dma),
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   295
					buffer_info->length, true);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   296
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   297
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   298
	/* Print RX Rings Summary */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   299
rx_ring_summary:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   300
	dev_info(&adapter->pdev->dev, "RX Rings Summary\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   301
	printk(KERN_INFO "Queue [NTU] [NTC]\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   302
	printk(KERN_INFO " %5d %5X %5X\n", 0,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   303
		rx_ring->next_to_use, rx_ring->next_to_clean);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   304
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   305
	/* Print RX Rings */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   306
	if (!netif_msg_rx_status(adapter))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   307
		goto exit;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   308
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   309
	dev_info(&adapter->pdev->dev, "RX Rings Dump\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   310
	switch (adapter->rx_ps_pages) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   311
	case 1:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   312
	case 2:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   313
	case 3:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   314
		/* [Extended] Packet Split Receive Descriptor Format
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   315
		 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   316
		 *    +-----------------------------------------------------+
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   317
		 *  0 |                Buffer Address 0 [63:0]              |
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   318
		 *    +-----------------------------------------------------+
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   319
		 *  8 |                Buffer Address 1 [63:0]              |
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   320
		 *    +-----------------------------------------------------+
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   321
		 * 16 |                Buffer Address 2 [63:0]              |
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   322
		 *    +-----------------------------------------------------+
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   323
		 * 24 |                Buffer Address 3 [63:0]              |
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   324
		 *    +-----------------------------------------------------+
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   325
		 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   326
		printk(KERN_INFO "R  [desc]      [buffer 0 63:0 ] "
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   327
			"[buffer 1 63:0 ] "
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   328
		       "[buffer 2 63:0 ] [buffer 3 63:0 ] [bi->dma       ] "
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   329
		       "[bi->skb] <-- Ext Pkt Split format\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   330
		/* [Extended] Receive Descriptor (Write-Back) Format
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   331
		 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   332
		 *   63       48 47    32 31     13 12    8 7    4 3        0
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   333
		 *   +------------------------------------------------------+
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   334
		 * 0 | Packet   | IP     |  Rsvd   | MRQ   | Rsvd | MRQ RSS |
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   335
		 *   | Checksum | Ident  |         | Queue |      |  Type   |
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   336
		 *   +------------------------------------------------------+
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   337
		 * 8 | VLAN Tag | Length | Extended Error | Extended Status |
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   338
		 *   +------------------------------------------------------+
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   339
		 *   63       48 47    32 31            20 19               0
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   340
		 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   341
		printk(KERN_INFO "RWB[desc]      [ck ipid mrqhsh] "
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   342
			"[vl   l0 ee  es] "
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   343
		       "[ l3  l2  l1 hs] [reserved      ] ---------------- "
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   344
		       "[bi->skb] <-- Ext Rx Write-Back format\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   345
		for (i = 0; i < rx_ring->count; i++) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   346
			buffer_info = &rx_ring->buffer_info[i];
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   347
			rx_desc_ps = E1000_RX_DESC_PS(*rx_ring, i);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   348
			u1 = (struct my_u1 *)rx_desc_ps;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   349
			staterr =
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   350
				le32_to_cpu(rx_desc_ps->wb.middle.status_error);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   351
			if (staterr & E1000_RXD_STAT_DD) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   352
				/* Descriptor Done */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   353
				printk(KERN_INFO "RWB[0x%03X]     %016llX "
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   354
					"%016llX %016llX %016llX "
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   355
					"---------------- %p", i,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   356
					le64_to_cpu(u1->a),
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   357
					le64_to_cpu(u1->b),
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   358
					le64_to_cpu(u1->c),
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   359
					le64_to_cpu(u1->d),
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   360
					buffer_info->skb);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   361
			} else {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   362
				printk(KERN_INFO "R  [0x%03X]     %016llX "
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   363
					"%016llX %016llX %016llX %016llX %p", i,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   364
					le64_to_cpu(u1->a),
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   365
					le64_to_cpu(u1->b),
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   366
					le64_to_cpu(u1->c),
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   367
					le64_to_cpu(u1->d),
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   368
					(u64)buffer_info->dma,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   369
					buffer_info->skb);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   370
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   371
				if (netif_msg_pktdata(adapter))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   372
					print_hex_dump(KERN_INFO, "",
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   373
						DUMP_PREFIX_ADDRESS, 16, 1,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   374
						phys_to_virt(buffer_info->dma),
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   375
						adapter->rx_ps_bsize0, true);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   376
			}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   377
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   378
			if (i == rx_ring->next_to_use)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   379
				printk(KERN_CONT " NTU\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   380
			else if (i == rx_ring->next_to_clean)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   381
				printk(KERN_CONT " NTC\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   382
			else
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   383
				printk(KERN_CONT "\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   384
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   385
		break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   386
	default:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   387
	case 0:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   388
		/* Legacy Receive Descriptor Format
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   389
		 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   390
		 * +-----------------------------------------------------+
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   391
		 * |                Buffer Address [63:0]                |
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   392
		 * +-----------------------------------------------------+
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   393
		 * | VLAN Tag | Errors | Status 0 | Packet csum | Length |
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   394
		 * +-----------------------------------------------------+
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   395
		 * 63       48 47    40 39      32 31         16 15      0
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   396
		 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   397
		printk(KERN_INFO "Rl[desc]     [address 63:0  ] "
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   398
			"[vl er S cks ln] [bi->dma       ] [bi->skb] "
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   399
			"<-- Legacy format\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   400
		for (i = 0; rx_ring->desc && (i < rx_ring->count); i++) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   401
			rx_desc = E1000_RX_DESC(*rx_ring, i);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   402
			buffer_info = &rx_ring->buffer_info[i];
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   403
			u0 = (struct my_u0 *)rx_desc;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   404
			printk(KERN_INFO "Rl[0x%03X]    %016llX %016llX "
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   405
				"%016llX %p",
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   406
				i, le64_to_cpu(u0->a), le64_to_cpu(u0->b),
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   407
				(u64)buffer_info->dma, buffer_info->skb);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   408
			if (i == rx_ring->next_to_use)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   409
				printk(KERN_CONT " NTU\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   410
			else if (i == rx_ring->next_to_clean)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   411
				printk(KERN_CONT " NTC\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   412
			else
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   413
				printk(KERN_CONT "\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   414
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   415
			if (netif_msg_pktdata(adapter))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   416
				print_hex_dump(KERN_INFO, "",
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   417
					DUMP_PREFIX_ADDRESS,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   418
					16, 1, phys_to_virt(buffer_info->dma),
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   419
					adapter->rx_buffer_len, true);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   420
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   421
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   422
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   423
exit:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   424
	return;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   425
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   426
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   427
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   428
 * e1000_desc_unused - calculate if we have unused descriptors
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   429
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   430
static int e1000_desc_unused(struct e1000_ring *ring)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   431
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   432
	if (ring->next_to_clean > ring->next_to_use)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   433
		return ring->next_to_clean - ring->next_to_use - 1;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   434
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   435
	return ring->count + ring->next_to_clean - ring->next_to_use - 1;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   436
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   437
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   438
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   439
 * e1000_receive_skb - helper function to handle Rx indications
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   440
 * @adapter: board private structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   441
 * @status: descriptor status field as written by hardware
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   442
 * @vlan: descriptor vlan field as written by hardware (no le/be conversion)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   443
 * @skb: pointer to sk_buff to be indicated to stack
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   444
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   445
static void e1000_receive_skb(struct e1000_adapter *adapter,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   446
			      struct net_device *netdev,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   447
			      struct sk_buff *skb,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   448
			      u8 status, __le16 vlan)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   449
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   450
	skb->protocol = eth_type_trans(skb, netdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   451
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   452
	if (adapter->vlgrp && (status & E1000_RXD_STAT_VP))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   453
		vlan_gro_receive(&adapter->napi, adapter->vlgrp,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   454
				 le16_to_cpu(vlan), skb);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   455
	else
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   456
		napi_gro_receive(&adapter->napi, skb);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   457
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   458
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   459
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   460
 * e1000_rx_checksum - Receive Checksum Offload for 82543
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   461
 * @adapter:     board private structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   462
 * @status_err:  receive descriptor status and error fields
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   463
 * @csum:	receive descriptor csum field
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   464
 * @sk_buff:     socket buffer with received data
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   465
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   466
static void e1000_rx_checksum(struct e1000_adapter *adapter, u32 status_err,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   467
			      u32 csum, struct sk_buff *skb)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   468
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   469
	u16 status = (u16)status_err;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   470
	u8 errors = (u8)(status_err >> 24);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   471
	skb->ip_summed = CHECKSUM_NONE;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   472
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   473
	/* Ignore Checksum bit is set */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   474
	if (status & E1000_RXD_STAT_IXSM)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   475
		return;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   476
	/* TCP/UDP checksum error bit is set */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   477
	if (errors & E1000_RXD_ERR_TCPE) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   478
		/* let the stack verify checksum errors */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   479
		adapter->hw_csum_err++;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   480
		return;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   481
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   482
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   483
	/* TCP/UDP Checksum has not been calculated */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   484
	if (!(status & (E1000_RXD_STAT_TCPCS | E1000_RXD_STAT_UDPCS)))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   485
		return;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   486
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   487
	/* It must be a TCP or UDP packet with a valid checksum */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   488
	if (status & E1000_RXD_STAT_TCPCS) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   489
		/* TCP checksum is good */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   490
		skb->ip_summed = CHECKSUM_UNNECESSARY;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   491
	} else {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   492
		/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   493
		 * IP fragment with UDP payload
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   494
		 * Hardware complements the payload checksum, so we undo it
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   495
		 * and then put the value in host order for further stack use.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   496
		 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   497
		__sum16 sum = (__force __sum16)htons(csum);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   498
		skb->csum = csum_unfold(~sum);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   499
		skb->ip_summed = CHECKSUM_COMPLETE;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   500
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   501
	adapter->hw_csum_good++;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   502
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   503
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   504
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   505
 * e1000_alloc_rx_buffers - Replace used receive buffers; legacy & extended
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   506
 * @adapter: address of board private structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   507
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   508
static void e1000_alloc_rx_buffers(struct e1000_adapter *adapter,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   509
				   int cleaned_count)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   510
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   511
	struct net_device *netdev = adapter->netdev;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   512
	struct pci_dev *pdev = adapter->pdev;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   513
	struct e1000_ring *rx_ring = adapter->rx_ring;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   514
	struct e1000_rx_desc *rx_desc;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   515
	struct e1000_buffer *buffer_info;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   516
	struct sk_buff *skb;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   517
	unsigned int i;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   518
	unsigned int bufsz = adapter->rx_buffer_len;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   519
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   520
	i = rx_ring->next_to_use;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   521
	buffer_info = &rx_ring->buffer_info[i];
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   522
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   523
	while (cleaned_count--) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   524
		skb = buffer_info->skb;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   525
		if (skb) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   526
			skb_trim(skb, 0);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   527
			goto map_skb;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   528
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   529
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   530
		skb = netdev_alloc_skb_ip_align(netdev, bufsz);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   531
		if (!skb) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   532
			/* Better luck next round */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   533
			adapter->alloc_rx_buff_failed++;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   534
			break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   535
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   536
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   537
		buffer_info->skb = skb;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   538
map_skb:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   539
		buffer_info->dma = dma_map_single(&pdev->dev, skb->data,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   540
						  adapter->rx_buffer_len,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   541
						  DMA_FROM_DEVICE);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   542
		if (dma_mapping_error(&pdev->dev, buffer_info->dma)) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   543
			dev_err(&pdev->dev, "RX DMA map failed\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   544
			adapter->rx_dma_failed++;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   545
			break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   546
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   547
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   548
		rx_desc = E1000_RX_DESC(*rx_ring, i);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   549
		rx_desc->buffer_addr = cpu_to_le64(buffer_info->dma);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   550
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   551
		if (unlikely(!(i & (E1000_RX_BUFFER_WRITE - 1)))) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   552
			/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   553
			 * Force memory writes to complete before letting h/w
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   554
			 * know there are new descriptors to fetch.  (Only
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   555
			 * applicable for weak-ordered memory model archs,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   556
			 * such as IA-64).
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   557
			 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   558
			wmb();
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   559
			writel(i, adapter->hw.hw_addr + rx_ring->tail);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   560
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   561
		i++;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   562
		if (i == rx_ring->count)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   563
			i = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   564
		buffer_info = &rx_ring->buffer_info[i];
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   565
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   566
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   567
	rx_ring->next_to_use = i;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   568
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   569
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   570
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   571
 * e1000_alloc_rx_buffers_ps - Replace used receive buffers; packet split
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   572
 * @adapter: address of board private structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   573
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   574
static void e1000_alloc_rx_buffers_ps(struct e1000_adapter *adapter,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   575
				      int cleaned_count)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   576
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   577
	struct net_device *netdev = adapter->netdev;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   578
	struct pci_dev *pdev = adapter->pdev;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   579
	union e1000_rx_desc_packet_split *rx_desc;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   580
	struct e1000_ring *rx_ring = adapter->rx_ring;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   581
	struct e1000_buffer *buffer_info;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   582
	struct e1000_ps_page *ps_page;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   583
	struct sk_buff *skb;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   584
	unsigned int i, j;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   585
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   586
	i = rx_ring->next_to_use;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   587
	buffer_info = &rx_ring->buffer_info[i];
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   588
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   589
	while (cleaned_count--) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   590
		rx_desc = E1000_RX_DESC_PS(*rx_ring, i);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   591
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   592
		for (j = 0; j < PS_PAGE_BUFFERS; j++) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   593
			ps_page = &buffer_info->ps_pages[j];
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   594
			if (j >= adapter->rx_ps_pages) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   595
				/* all unused desc entries get hw null ptr */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   596
				rx_desc->read.buffer_addr[j+1] = ~cpu_to_le64(0);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   597
				continue;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   598
			}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   599
			if (!ps_page->page) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   600
				ps_page->page = alloc_page(GFP_ATOMIC);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   601
				if (!ps_page->page) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   602
					adapter->alloc_rx_buff_failed++;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   603
					goto no_buffers;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   604
				}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   605
				ps_page->dma = dma_map_page(&pdev->dev,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   606
							    ps_page->page,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   607
							    0, PAGE_SIZE,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   608
							    DMA_FROM_DEVICE);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   609
				if (dma_mapping_error(&pdev->dev,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   610
						      ps_page->dma)) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   611
					dev_err(&adapter->pdev->dev,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   612
					  "RX DMA page map failed\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   613
					adapter->rx_dma_failed++;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   614
					goto no_buffers;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   615
				}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   616
			}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   617
			/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   618
			 * Refresh the desc even if buffer_addrs
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   619
			 * didn't change because each write-back
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   620
			 * erases this info.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   621
			 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   622
			rx_desc->read.buffer_addr[j+1] =
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   623
			     cpu_to_le64(ps_page->dma);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   624
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   625
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   626
		skb = netdev_alloc_skb_ip_align(netdev,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   627
						adapter->rx_ps_bsize0);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   628
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   629
		if (!skb) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   630
			adapter->alloc_rx_buff_failed++;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   631
			break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   632
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   633
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   634
		buffer_info->skb = skb;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   635
		buffer_info->dma = dma_map_single(&pdev->dev, skb->data,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   636
						  adapter->rx_ps_bsize0,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   637
						  DMA_FROM_DEVICE);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   638
		if (dma_mapping_error(&pdev->dev, buffer_info->dma)) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   639
			dev_err(&pdev->dev, "RX DMA map failed\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   640
			adapter->rx_dma_failed++;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   641
			/* cleanup skb */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   642
			dev_kfree_skb_any(skb);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   643
			buffer_info->skb = NULL;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   644
			break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   645
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   646
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   647
		rx_desc->read.buffer_addr[0] = cpu_to_le64(buffer_info->dma);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   648
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   649
		if (unlikely(!(i & (E1000_RX_BUFFER_WRITE - 1)))) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   650
			/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   651
			 * Force memory writes to complete before letting h/w
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   652
			 * know there are new descriptors to fetch.  (Only
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   653
			 * applicable for weak-ordered memory model archs,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   654
			 * such as IA-64).
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   655
			 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   656
			wmb();
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   657
			writel(i<<1, adapter->hw.hw_addr + rx_ring->tail);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   658
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   659
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   660
		i++;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   661
		if (i == rx_ring->count)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   662
			i = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   663
		buffer_info = &rx_ring->buffer_info[i];
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   664
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   665
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   666
no_buffers:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   667
	rx_ring->next_to_use = i;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   668
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   669
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   670
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   671
 * e1000_alloc_jumbo_rx_buffers - Replace used jumbo receive buffers
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   672
 * @adapter: address of board private structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   673
 * @cleaned_count: number of buffers to allocate this pass
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   674
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   675
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   676
static void e1000_alloc_jumbo_rx_buffers(struct e1000_adapter *adapter,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   677
                                         int cleaned_count)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   678
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   679
	struct net_device *netdev = adapter->netdev;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   680
	struct pci_dev *pdev = adapter->pdev;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   681
	struct e1000_rx_desc *rx_desc;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   682
	struct e1000_ring *rx_ring = adapter->rx_ring;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   683
	struct e1000_buffer *buffer_info;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   684
	struct sk_buff *skb;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   685
	unsigned int i;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   686
	unsigned int bufsz = 256 - 16 /* for skb_reserve */;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   687
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   688
	i = rx_ring->next_to_use;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   689
	buffer_info = &rx_ring->buffer_info[i];
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   690
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   691
	while (cleaned_count--) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   692
		skb = buffer_info->skb;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   693
		if (skb) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   694
			skb_trim(skb, 0);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   695
			goto check_page;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   696
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   697
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   698
		skb = netdev_alloc_skb_ip_align(netdev, bufsz);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   699
		if (unlikely(!skb)) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   700
			/* Better luck next round */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   701
			adapter->alloc_rx_buff_failed++;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   702
			break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   703
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   704
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   705
		buffer_info->skb = skb;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   706
check_page:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   707
		/* allocate a new page if necessary */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   708
		if (!buffer_info->page) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   709
			buffer_info->page = alloc_page(GFP_ATOMIC);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   710
			if (unlikely(!buffer_info->page)) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   711
				adapter->alloc_rx_buff_failed++;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   712
				break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   713
			}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   714
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   715
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   716
		if (!buffer_info->dma)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   717
			buffer_info->dma = dma_map_page(&pdev->dev,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   718
			                                buffer_info->page, 0,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   719
			                                PAGE_SIZE,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   720
							DMA_FROM_DEVICE);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   721
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   722
		rx_desc = E1000_RX_DESC(*rx_ring, i);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   723
		rx_desc->buffer_addr = cpu_to_le64(buffer_info->dma);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   724
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   725
		if (unlikely(++i == rx_ring->count))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   726
			i = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   727
		buffer_info = &rx_ring->buffer_info[i];
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   728
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   729
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   730
	if (likely(rx_ring->next_to_use != i)) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   731
		rx_ring->next_to_use = i;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   732
		if (unlikely(i-- == 0))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   733
			i = (rx_ring->count - 1);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   734
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   735
		/* Force memory writes to complete before letting h/w
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   736
		 * know there are new descriptors to fetch.  (Only
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   737
		 * applicable for weak-ordered memory model archs,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   738
		 * such as IA-64). */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   739
		wmb();
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   740
		writel(i, adapter->hw.hw_addr + rx_ring->tail);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   741
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   742
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   743
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   744
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   745
 * e1000_clean_rx_irq - Send received data up the network stack; legacy
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   746
 * @adapter: board private structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   747
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   748
 * the return value indicates whether actual cleaning was done, there
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   749
 * is no guarantee that everything was cleaned
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   750
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   751
static bool e1000_clean_rx_irq(struct e1000_adapter *adapter,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   752
			       int *work_done, int work_to_do)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   753
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   754
	struct net_device *netdev = adapter->netdev;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   755
	struct pci_dev *pdev = adapter->pdev;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   756
	struct e1000_hw *hw = &adapter->hw;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   757
	struct e1000_ring *rx_ring = adapter->rx_ring;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   758
	struct e1000_rx_desc *rx_desc, *next_rxd;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   759
	struct e1000_buffer *buffer_info, *next_buffer;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   760
	u32 length;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   761
	unsigned int i;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   762
	int cleaned_count = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   763
	bool cleaned = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   764
	unsigned int total_rx_bytes = 0, total_rx_packets = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   765
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   766
	i = rx_ring->next_to_clean;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   767
	rx_desc = E1000_RX_DESC(*rx_ring, i);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   768
	buffer_info = &rx_ring->buffer_info[i];
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   769
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   770
	while (rx_desc->status & E1000_RXD_STAT_DD) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   771
		struct sk_buff *skb;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   772
		u8 status;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   773
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   774
		if (*work_done >= work_to_do)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   775
			break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   776
		(*work_done)++;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   777
		rmb();	/* read descriptor and rx_buffer_info after status DD */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   778
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   779
		status = rx_desc->status;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   780
		skb = buffer_info->skb;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   781
		buffer_info->skb = NULL;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   782
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   783
		prefetch(skb->data - NET_IP_ALIGN);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   784
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   785
		i++;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   786
		if (i == rx_ring->count)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   787
			i = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   788
		next_rxd = E1000_RX_DESC(*rx_ring, i);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   789
		prefetch(next_rxd);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   790
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   791
		next_buffer = &rx_ring->buffer_info[i];
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   792
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   793
		cleaned = 1;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   794
		cleaned_count++;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   795
		dma_unmap_single(&pdev->dev,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   796
				 buffer_info->dma,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   797
				 adapter->rx_buffer_len,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   798
				 DMA_FROM_DEVICE);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   799
		buffer_info->dma = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   800
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   801
		length = le16_to_cpu(rx_desc->length);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   802
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   803
		/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   804
		 * !EOP means multiple descriptors were used to store a single
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   805
		 * packet, if that's the case we need to toss it.  In fact, we
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   806
		 * need to toss every packet with the EOP bit clear and the
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   807
		 * next frame that _does_ have the EOP bit set, as it is by
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   808
		 * definition only a frame fragment
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   809
		 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   810
		if (unlikely(!(status & E1000_RXD_STAT_EOP)))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   811
			adapter->flags2 |= FLAG2_IS_DISCARDING;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   812
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   813
		if (adapter->flags2 & FLAG2_IS_DISCARDING) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   814
			/* All receives must fit into a single buffer */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   815
			e_dbg("Receive packet consumed multiple buffers\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   816
			/* recycle */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   817
			buffer_info->skb = skb;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   818
			if (status & E1000_RXD_STAT_EOP)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   819
				adapter->flags2 &= ~FLAG2_IS_DISCARDING;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   820
			goto next_desc;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   821
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   822
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   823
		if (rx_desc->errors & E1000_RXD_ERR_FRAME_ERR_MASK) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   824
			/* recycle */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   825
			buffer_info->skb = skb;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   826
			goto next_desc;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   827
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   828
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   829
		/* adjust length to remove Ethernet CRC */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   830
		if (!(adapter->flags2 & FLAG2_CRC_STRIPPING))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   831
			length -= 4;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   832
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   833
		total_rx_bytes += length;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   834
		total_rx_packets++;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   835
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   836
		/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   837
		 * code added for copybreak, this should improve
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   838
		 * performance for small packets with large amounts
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   839
		 * of reassembly being done in the stack
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   840
		 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   841
		if (length < copybreak) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   842
			struct sk_buff *new_skb =
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   843
			    netdev_alloc_skb_ip_align(netdev, length);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   844
			if (new_skb) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   845
				skb_copy_to_linear_data_offset(new_skb,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   846
							       -NET_IP_ALIGN,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   847
							       (skb->data -
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   848
								NET_IP_ALIGN),
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   849
							       (length +
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   850
								NET_IP_ALIGN));
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   851
				/* save the skb in buffer_info as good */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   852
				buffer_info->skb = skb;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   853
				skb = new_skb;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   854
			}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   855
			/* else just continue with the old one */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   856
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   857
		/* end copybreak code */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   858
		skb_put(skb, length);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   859
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   860
		/* Receive Checksum Offload */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   861
		e1000_rx_checksum(adapter,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   862
				  (u32)(status) |
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   863
				  ((u32)(rx_desc->errors) << 24),
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   864
				  le16_to_cpu(rx_desc->csum), skb);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   865
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   866
		e1000_receive_skb(adapter, netdev, skb,status,rx_desc->special);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   867
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   868
next_desc:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   869
		rx_desc->status = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   870
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   871
		/* return some buffers to hardware, one at a time is too slow */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   872
		if (cleaned_count >= E1000_RX_BUFFER_WRITE) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   873
			adapter->alloc_rx_buf(adapter, cleaned_count);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   874
			cleaned_count = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   875
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   876
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   877
		/* use prefetched values */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   878
		rx_desc = next_rxd;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   879
		buffer_info = next_buffer;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   880
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   881
	rx_ring->next_to_clean = i;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   882
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   883
	cleaned_count = e1000_desc_unused(rx_ring);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   884
	if (cleaned_count)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   885
		adapter->alloc_rx_buf(adapter, cleaned_count);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   886
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   887
	adapter->total_rx_bytes += total_rx_bytes;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   888
	adapter->total_rx_packets += total_rx_packets;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   889
	netdev->stats.rx_bytes += total_rx_bytes;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   890
	netdev->stats.rx_packets += total_rx_packets;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   891
	return cleaned;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   892
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   893
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   894
static void e1000_put_txbuf(struct e1000_adapter *adapter,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   895
			     struct e1000_buffer *buffer_info)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   896
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   897
	if (buffer_info->dma) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   898
		if (buffer_info->mapped_as_page)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   899
			dma_unmap_page(&adapter->pdev->dev, buffer_info->dma,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   900
				       buffer_info->length, DMA_TO_DEVICE);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   901
		else
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   902
			dma_unmap_single(&adapter->pdev->dev, buffer_info->dma,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   903
					 buffer_info->length, DMA_TO_DEVICE);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   904
		buffer_info->dma = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   905
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   906
	if (buffer_info->skb) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   907
		dev_kfree_skb_any(buffer_info->skb);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   908
		buffer_info->skb = NULL;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   909
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   910
	buffer_info->time_stamp = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   911
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   912
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   913
static void e1000_print_hw_hang(struct work_struct *work)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   914
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   915
	struct e1000_adapter *adapter = container_of(work,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   916
	                                             struct e1000_adapter,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   917
	                                             print_hang_task);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   918
	struct e1000_ring *tx_ring = adapter->tx_ring;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   919
	unsigned int i = tx_ring->next_to_clean;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   920
	unsigned int eop = tx_ring->buffer_info[i].next_to_watch;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   921
	struct e1000_tx_desc *eop_desc = E1000_TX_DESC(*tx_ring, eop);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   922
	struct e1000_hw *hw = &adapter->hw;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   923
	u16 phy_status, phy_1000t_status, phy_ext_status;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   924
	u16 pci_status;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   925
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   926
	e1e_rphy(hw, PHY_STATUS, &phy_status);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   927
	e1e_rphy(hw, PHY_1000T_STATUS, &phy_1000t_status);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   928
	e1e_rphy(hw, PHY_EXT_STATUS, &phy_ext_status);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   929
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   930
	pci_read_config_word(adapter->pdev, PCI_STATUS, &pci_status);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   931
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   932
	/* detected Hardware unit hang */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   933
	e_err("Detected Hardware Unit Hang:\n"
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   934
	      "  TDH                  <%x>\n"
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   935
	      "  TDT                  <%x>\n"
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   936
	      "  next_to_use          <%x>\n"
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   937
	      "  next_to_clean        <%x>\n"
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   938
	      "buffer_info[next_to_clean]:\n"
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   939
	      "  time_stamp           <%lx>\n"
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   940
	      "  next_to_watch        <%x>\n"
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   941
	      "  jiffies              <%lx>\n"
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   942
	      "  next_to_watch.status <%x>\n"
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   943
	      "MAC Status             <%x>\n"
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   944
	      "PHY Status             <%x>\n"
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   945
	      "PHY 1000BASE-T Status  <%x>\n"
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   946
	      "PHY Extended Status    <%x>\n"
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   947
	      "PCI Status             <%x>\n",
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   948
	      readl(adapter->hw.hw_addr + tx_ring->head),
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   949
	      readl(adapter->hw.hw_addr + tx_ring->tail),
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   950
	      tx_ring->next_to_use,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   951
	      tx_ring->next_to_clean,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   952
	      tx_ring->buffer_info[eop].time_stamp,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   953
	      eop,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   954
	      jiffies,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   955
	      eop_desc->upper.fields.status,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   956
	      er32(STATUS),
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   957
	      phy_status,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   958
	      phy_1000t_status,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   959
	      phy_ext_status,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   960
	      pci_status);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   961
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   962
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   963
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   964
 * e1000_clean_tx_irq - Reclaim resources after transmit completes
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   965
 * @adapter: board private structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   966
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   967
 * the return value indicates whether actual cleaning was done, there
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   968
 * is no guarantee that everything was cleaned
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   969
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   970
static bool e1000_clean_tx_irq(struct e1000_adapter *adapter)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   971
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   972
	struct net_device *netdev = adapter->netdev;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   973
	struct e1000_hw *hw = &adapter->hw;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   974
	struct e1000_ring *tx_ring = adapter->tx_ring;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   975
	struct e1000_tx_desc *tx_desc, *eop_desc;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   976
	struct e1000_buffer *buffer_info;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   977
	unsigned int i, eop;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   978
	unsigned int count = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   979
	unsigned int total_tx_bytes = 0, total_tx_packets = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   980
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   981
	i = tx_ring->next_to_clean;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   982
	eop = tx_ring->buffer_info[i].next_to_watch;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   983
	eop_desc = E1000_TX_DESC(*tx_ring, eop);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   984
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   985
	while ((eop_desc->upper.data & cpu_to_le32(E1000_TXD_STAT_DD)) &&
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   986
	       (count < tx_ring->count)) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   987
		bool cleaned = false;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   988
		rmb(); /* read buffer_info after eop_desc */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   989
		for (; !cleaned; count++) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   990
			tx_desc = E1000_TX_DESC(*tx_ring, i);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   991
			buffer_info = &tx_ring->buffer_info[i];
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   992
			cleaned = (i == eop);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   993
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   994
			if (cleaned) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   995
				total_tx_packets += buffer_info->segs;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   996
				total_tx_bytes += buffer_info->bytecount;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   997
			}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   998
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   999
			e1000_put_txbuf(adapter, buffer_info);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1000
			tx_desc->upper.data = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1001
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1002
			i++;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1003
			if (i == tx_ring->count)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1004
				i = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1005
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1006
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1007
		if (i == tx_ring->next_to_use)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1008
			break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1009
		eop = tx_ring->buffer_info[i].next_to_watch;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1010
		eop_desc = E1000_TX_DESC(*tx_ring, eop);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1011
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1012
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1013
	tx_ring->next_to_clean = i;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1014
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1015
#define TX_WAKE_THRESHOLD 32
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1016
	if (count && netif_carrier_ok(netdev) &&
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1017
	    e1000_desc_unused(tx_ring) >= TX_WAKE_THRESHOLD) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1018
		/* Make sure that anybody stopping the queue after this
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1019
		 * sees the new next_to_clean.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1020
		 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1021
		smp_mb();
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1022
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1023
		if (netif_queue_stopped(netdev) &&
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1024
		    !(test_bit(__E1000_DOWN, &adapter->state))) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1025
			netif_wake_queue(netdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1026
			++adapter->restart_queue;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1027
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1028
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1029
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1030
	if (adapter->detect_tx_hung) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1031
		/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1032
		 * Detect a transmit hang in hardware, this serializes the
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1033
		 * check with the clearing of time_stamp and movement of i
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1034
		 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1035
		adapter->detect_tx_hung = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1036
		if (tx_ring->buffer_info[i].time_stamp &&
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1037
		    time_after(jiffies, tx_ring->buffer_info[i].time_stamp
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1038
			       + (adapter->tx_timeout_factor * HZ)) &&
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1039
		    !(er32(STATUS) & E1000_STATUS_TXOFF)) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1040
			schedule_work(&adapter->print_hang_task);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1041
			netif_stop_queue(netdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1042
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1043
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1044
	adapter->total_tx_bytes += total_tx_bytes;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1045
	adapter->total_tx_packets += total_tx_packets;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1046
	netdev->stats.tx_bytes += total_tx_bytes;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1047
	netdev->stats.tx_packets += total_tx_packets;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1048
	return (count < tx_ring->count);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1049
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1050
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1051
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1052
 * e1000_clean_rx_irq_ps - Send received data up the network stack; packet split
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1053
 * @adapter: board private structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1054
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1055
 * the return value indicates whether actual cleaning was done, there
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1056
 * is no guarantee that everything was cleaned
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1057
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1058
static bool e1000_clean_rx_irq_ps(struct e1000_adapter *adapter,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1059
				  int *work_done, int work_to_do)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1060
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1061
	struct e1000_hw *hw = &adapter->hw;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1062
	union e1000_rx_desc_packet_split *rx_desc, *next_rxd;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1063
	struct net_device *netdev = adapter->netdev;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1064
	struct pci_dev *pdev = adapter->pdev;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1065
	struct e1000_ring *rx_ring = adapter->rx_ring;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1066
	struct e1000_buffer *buffer_info, *next_buffer;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1067
	struct e1000_ps_page *ps_page;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1068
	struct sk_buff *skb;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1069
	unsigned int i, j;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1070
	u32 length, staterr;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1071
	int cleaned_count = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1072
	bool cleaned = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1073
	unsigned int total_rx_bytes = 0, total_rx_packets = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1074
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1075
	i = rx_ring->next_to_clean;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1076
	rx_desc = E1000_RX_DESC_PS(*rx_ring, i);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1077
	staterr = le32_to_cpu(rx_desc->wb.middle.status_error);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1078
	buffer_info = &rx_ring->buffer_info[i];
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1079
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1080
	while (staterr & E1000_RXD_STAT_DD) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1081
		if (*work_done >= work_to_do)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1082
			break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1083
		(*work_done)++;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1084
		skb = buffer_info->skb;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1085
		rmb();	/* read descriptor and rx_buffer_info after status DD */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1086
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1087
		/* in the packet split case this is header only */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1088
		prefetch(skb->data - NET_IP_ALIGN);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1089
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1090
		i++;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1091
		if (i == rx_ring->count)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1092
			i = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1093
		next_rxd = E1000_RX_DESC_PS(*rx_ring, i);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1094
		prefetch(next_rxd);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1095
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1096
		next_buffer = &rx_ring->buffer_info[i];
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1097
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1098
		cleaned = 1;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1099
		cleaned_count++;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1100
		dma_unmap_single(&pdev->dev, buffer_info->dma,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1101
				 adapter->rx_ps_bsize0,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1102
				 DMA_FROM_DEVICE);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1103
		buffer_info->dma = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1104
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1105
		/* see !EOP comment in other rx routine */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1106
		if (!(staterr & E1000_RXD_STAT_EOP))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1107
			adapter->flags2 |= FLAG2_IS_DISCARDING;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1108
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1109
		if (adapter->flags2 & FLAG2_IS_DISCARDING) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1110
			e_dbg("Packet Split buffers didn't pick up the full "
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1111
			      "packet\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1112
			dev_kfree_skb_irq(skb);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1113
			if (staterr & E1000_RXD_STAT_EOP)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1114
				adapter->flags2 &= ~FLAG2_IS_DISCARDING;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1115
			goto next_desc;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1116
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1117
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1118
		if (staterr & E1000_RXDEXT_ERR_FRAME_ERR_MASK) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1119
			dev_kfree_skb_irq(skb);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1120
			goto next_desc;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1121
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1122
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1123
		length = le16_to_cpu(rx_desc->wb.middle.length0);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1124
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1125
		if (!length) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1126
			e_dbg("Last part of the packet spanning multiple "
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1127
			      "descriptors\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1128
			dev_kfree_skb_irq(skb);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1129
			goto next_desc;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1130
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1131
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1132
		/* Good Receive */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1133
		skb_put(skb, length);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1134
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1135
		{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1136
		/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1137
		 * this looks ugly, but it seems compiler issues make it
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1138
		 * more efficient than reusing j
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1139
		 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1140
		int l1 = le16_to_cpu(rx_desc->wb.upper.length[0]);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1141
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1142
		/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1143
		 * page alloc/put takes too long and effects small packet
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1144
		 * throughput, so unsplit small packets and save the alloc/put
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1145
		 * only valid in softirq (napi) context to call kmap_*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1146
		 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1147
		if (l1 && (l1 <= copybreak) &&
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1148
		    ((length + l1) <= adapter->rx_ps_bsize0)) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1149
			u8 *vaddr;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1150
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1151
			ps_page = &buffer_info->ps_pages[0];
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1152
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1153
			/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1154
			 * there is no documentation about how to call
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1155
			 * kmap_atomic, so we can't hold the mapping
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1156
			 * very long
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1157
			 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1158
			dma_sync_single_for_cpu(&pdev->dev, ps_page->dma,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1159
						PAGE_SIZE, DMA_FROM_DEVICE);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1160
			vaddr = kmap_atomic(ps_page->page, KM_SKB_DATA_SOFTIRQ);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1161
			memcpy(skb_tail_pointer(skb), vaddr, l1);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1162
			kunmap_atomic(vaddr, KM_SKB_DATA_SOFTIRQ);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1163
			dma_sync_single_for_device(&pdev->dev, ps_page->dma,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1164
						   PAGE_SIZE, DMA_FROM_DEVICE);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1165
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1166
			/* remove the CRC */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1167
			if (!(adapter->flags2 & FLAG2_CRC_STRIPPING))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1168
				l1 -= 4;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1169
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1170
			skb_put(skb, l1);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1171
			goto copydone;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1172
		} /* if */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1173
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1174
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1175
		for (j = 0; j < PS_PAGE_BUFFERS; j++) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1176
			length = le16_to_cpu(rx_desc->wb.upper.length[j]);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1177
			if (!length)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1178
				break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1179
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1180
			ps_page = &buffer_info->ps_pages[j];
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1181
			dma_unmap_page(&pdev->dev, ps_page->dma, PAGE_SIZE,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1182
				       DMA_FROM_DEVICE);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1183
			ps_page->dma = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1184
			skb_fill_page_desc(skb, j, ps_page->page, 0, length);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1185
			ps_page->page = NULL;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1186
			skb->len += length;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1187
			skb->data_len += length;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1188
			skb->truesize += length;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1189
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1190
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1191
		/* strip the ethernet crc, problem is we're using pages now so
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1192
		 * this whole operation can get a little cpu intensive
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1193
		 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1194
		if (!(adapter->flags2 & FLAG2_CRC_STRIPPING))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1195
			pskb_trim(skb, skb->len - 4);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1196
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1197
copydone:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1198
		total_rx_bytes += skb->len;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1199
		total_rx_packets++;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1200
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1201
		e1000_rx_checksum(adapter, staterr, le16_to_cpu(
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1202
			rx_desc->wb.lower.hi_dword.csum_ip.csum), skb);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1203
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1204
		if (rx_desc->wb.upper.header_status &
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1205
			   cpu_to_le16(E1000_RXDPS_HDRSTAT_HDRSP))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1206
			adapter->rx_hdr_split++;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1207
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1208
		e1000_receive_skb(adapter, netdev, skb,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1209
				  staterr, rx_desc->wb.middle.vlan);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1210
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1211
next_desc:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1212
		rx_desc->wb.middle.status_error &= cpu_to_le32(~0xFF);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1213
		buffer_info->skb = NULL;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1214
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1215
		/* return some buffers to hardware, one at a time is too slow */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1216
		if (cleaned_count >= E1000_RX_BUFFER_WRITE) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1217
			adapter->alloc_rx_buf(adapter, cleaned_count);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1218
			cleaned_count = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1219
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1220
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1221
		/* use prefetched values */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1222
		rx_desc = next_rxd;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1223
		buffer_info = next_buffer;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1224
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1225
		staterr = le32_to_cpu(rx_desc->wb.middle.status_error);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1226
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1227
	rx_ring->next_to_clean = i;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1228
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1229
	cleaned_count = e1000_desc_unused(rx_ring);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1230
	if (cleaned_count)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1231
		adapter->alloc_rx_buf(adapter, cleaned_count);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1232
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1233
	adapter->total_rx_bytes += total_rx_bytes;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1234
	adapter->total_rx_packets += total_rx_packets;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1235
	netdev->stats.rx_bytes += total_rx_bytes;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1236
	netdev->stats.rx_packets += total_rx_packets;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1237
	return cleaned;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1238
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1239
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1240
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1241
 * e1000_consume_page - helper function
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1242
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1243
static void e1000_consume_page(struct e1000_buffer *bi, struct sk_buff *skb,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1244
                               u16 length)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1245
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1246
	bi->page = NULL;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1247
	skb->len += length;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1248
	skb->data_len += length;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1249
	skb->truesize += length;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1250
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1251
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1252
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1253
 * e1000_clean_jumbo_rx_irq - Send received data up the network stack; legacy
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1254
 * @adapter: board private structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1255
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1256
 * the return value indicates whether actual cleaning was done, there
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1257
 * is no guarantee that everything was cleaned
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1258
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1259
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1260
static bool e1000_clean_jumbo_rx_irq(struct e1000_adapter *adapter,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1261
                                     int *work_done, int work_to_do)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1262
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1263
	struct net_device *netdev = adapter->netdev;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1264
	struct pci_dev *pdev = adapter->pdev;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1265
	struct e1000_ring *rx_ring = adapter->rx_ring;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1266
	struct e1000_rx_desc *rx_desc, *next_rxd;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1267
	struct e1000_buffer *buffer_info, *next_buffer;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1268
	u32 length;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1269
	unsigned int i;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1270
	int cleaned_count = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1271
	bool cleaned = false;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1272
	unsigned int total_rx_bytes=0, total_rx_packets=0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1273
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1274
	i = rx_ring->next_to_clean;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1275
	rx_desc = E1000_RX_DESC(*rx_ring, i);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1276
	buffer_info = &rx_ring->buffer_info[i];
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1277
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1278
	while (rx_desc->status & E1000_RXD_STAT_DD) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1279
		struct sk_buff *skb;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1280
		u8 status;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1281
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1282
		if (*work_done >= work_to_do)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1283
			break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1284
		(*work_done)++;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1285
		rmb();	/* read descriptor and rx_buffer_info after status DD */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1286
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1287
		status = rx_desc->status;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1288
		skb = buffer_info->skb;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1289
		buffer_info->skb = NULL;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1290
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1291
		++i;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1292
		if (i == rx_ring->count)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1293
			i = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1294
		next_rxd = E1000_RX_DESC(*rx_ring, i);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1295
		prefetch(next_rxd);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1296
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1297
		next_buffer = &rx_ring->buffer_info[i];
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1298
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1299
		cleaned = true;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1300
		cleaned_count++;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1301
		dma_unmap_page(&pdev->dev, buffer_info->dma, PAGE_SIZE,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1302
			       DMA_FROM_DEVICE);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1303
		buffer_info->dma = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1304
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1305
		length = le16_to_cpu(rx_desc->length);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1306
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1307
		/* errors is only valid for DD + EOP descriptors */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1308
		if (unlikely((status & E1000_RXD_STAT_EOP) &&
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1309
		    (rx_desc->errors & E1000_RXD_ERR_FRAME_ERR_MASK))) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1310
				/* recycle both page and skb */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1311
				buffer_info->skb = skb;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1312
				/* an error means any chain goes out the window
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1313
				 * too */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1314
				if (rx_ring->rx_skb_top)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1315
					dev_kfree_skb(rx_ring->rx_skb_top);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1316
				rx_ring->rx_skb_top = NULL;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1317
				goto next_desc;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1318
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1319
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1320
#define rxtop rx_ring->rx_skb_top
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1321
		if (!(status & E1000_RXD_STAT_EOP)) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1322
			/* this descriptor is only the beginning (or middle) */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1323
			if (!rxtop) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1324
				/* this is the beginning of a chain */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1325
				rxtop = skb;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1326
				skb_fill_page_desc(rxtop, 0, buffer_info->page,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1327
				                   0, length);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1328
			} else {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1329
				/* this is the middle of a chain */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1330
				skb_fill_page_desc(rxtop,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1331
				    skb_shinfo(rxtop)->nr_frags,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1332
				    buffer_info->page, 0, length);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1333
				/* re-use the skb, only consumed the page */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1334
				buffer_info->skb = skb;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1335
			}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1336
			e1000_consume_page(buffer_info, rxtop, length);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1337
			goto next_desc;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1338
		} else {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1339
			if (rxtop) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1340
				/* end of the chain */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1341
				skb_fill_page_desc(rxtop,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1342
				    skb_shinfo(rxtop)->nr_frags,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1343
				    buffer_info->page, 0, length);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1344
				/* re-use the current skb, we only consumed the
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1345
				 * page */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1346
				buffer_info->skb = skb;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1347
				skb = rxtop;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1348
				rxtop = NULL;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1349
				e1000_consume_page(buffer_info, skb, length);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1350
			} else {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1351
				/* no chain, got EOP, this buf is the packet
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1352
				 * copybreak to save the put_page/alloc_page */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1353
				if (length <= copybreak &&
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1354
				    skb_tailroom(skb) >= length) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1355
					u8 *vaddr;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1356
					vaddr = kmap_atomic(buffer_info->page,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1357
					                   KM_SKB_DATA_SOFTIRQ);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1358
					memcpy(skb_tail_pointer(skb), vaddr,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1359
					       length);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1360
					kunmap_atomic(vaddr,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1361
					              KM_SKB_DATA_SOFTIRQ);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1362
					/* re-use the page, so don't erase
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1363
					 * buffer_info->page */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1364
					skb_put(skb, length);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1365
				} else {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1366
					skb_fill_page_desc(skb, 0,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1367
					                   buffer_info->page, 0,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1368
				                           length);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1369
					e1000_consume_page(buffer_info, skb,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1370
					                   length);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1371
				}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1372
			}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1373
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1374
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1375
		/* Receive Checksum Offload XXX recompute due to CRC strip? */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1376
		e1000_rx_checksum(adapter,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1377
		                  (u32)(status) |
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1378
		                  ((u32)(rx_desc->errors) << 24),
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1379
		                  le16_to_cpu(rx_desc->csum), skb);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1380
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1381
		/* probably a little skewed due to removing CRC */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1382
		total_rx_bytes += skb->len;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1383
		total_rx_packets++;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1384
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1385
		/* eth type trans needs skb->data to point to something */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1386
		if (!pskb_may_pull(skb, ETH_HLEN)) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1387
			e_err("pskb_may_pull failed.\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1388
			dev_kfree_skb(skb);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1389
			goto next_desc;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1390
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1391
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1392
		e1000_receive_skb(adapter, netdev, skb, status,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1393
		                  rx_desc->special);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1394
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1395
next_desc:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1396
		rx_desc->status = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1397
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1398
		/* return some buffers to hardware, one at a time is too slow */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1399
		if (unlikely(cleaned_count >= E1000_RX_BUFFER_WRITE)) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1400
			adapter->alloc_rx_buf(adapter, cleaned_count);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1401
			cleaned_count = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1402
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1403
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1404
		/* use prefetched values */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1405
		rx_desc = next_rxd;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1406
		buffer_info = next_buffer;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1407
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1408
	rx_ring->next_to_clean = i;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1409
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1410
	cleaned_count = e1000_desc_unused(rx_ring);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1411
	if (cleaned_count)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1412
		adapter->alloc_rx_buf(adapter, cleaned_count);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1413
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1414
	adapter->total_rx_bytes += total_rx_bytes;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1415
	adapter->total_rx_packets += total_rx_packets;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1416
	netdev->stats.rx_bytes += total_rx_bytes;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1417
	netdev->stats.rx_packets += total_rx_packets;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1418
	return cleaned;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1419
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1420
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1421
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1422
 * e1000_clean_rx_ring - Free Rx Buffers per Queue
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1423
 * @adapter: board private structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1424
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1425
static void e1000_clean_rx_ring(struct e1000_adapter *adapter)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1426
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1427
	struct e1000_ring *rx_ring = adapter->rx_ring;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1428
	struct e1000_buffer *buffer_info;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1429
	struct e1000_ps_page *ps_page;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1430
	struct pci_dev *pdev = adapter->pdev;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1431
	unsigned int i, j;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1432
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1433
	/* Free all the Rx ring sk_buffs */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1434
	for (i = 0; i < rx_ring->count; i++) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1435
		buffer_info = &rx_ring->buffer_info[i];
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1436
		if (buffer_info->dma) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1437
			if (adapter->clean_rx == e1000_clean_rx_irq)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1438
				dma_unmap_single(&pdev->dev, buffer_info->dma,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1439
						 adapter->rx_buffer_len,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1440
						 DMA_FROM_DEVICE);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1441
			else if (adapter->clean_rx == e1000_clean_jumbo_rx_irq)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1442
				dma_unmap_page(&pdev->dev, buffer_info->dma,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1443
				               PAGE_SIZE,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1444
					       DMA_FROM_DEVICE);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1445
			else if (adapter->clean_rx == e1000_clean_rx_irq_ps)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1446
				dma_unmap_single(&pdev->dev, buffer_info->dma,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1447
						 adapter->rx_ps_bsize0,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1448
						 DMA_FROM_DEVICE);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1449
			buffer_info->dma = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1450
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1451
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1452
		if (buffer_info->page) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1453
			put_page(buffer_info->page);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1454
			buffer_info->page = NULL;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1455
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1456
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1457
		if (buffer_info->skb) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1458
			dev_kfree_skb(buffer_info->skb);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1459
			buffer_info->skb = NULL;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1460
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1461
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1462
		for (j = 0; j < PS_PAGE_BUFFERS; j++) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1463
			ps_page = &buffer_info->ps_pages[j];
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1464
			if (!ps_page->page)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1465
				break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1466
			dma_unmap_page(&pdev->dev, ps_page->dma, PAGE_SIZE,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1467
				       DMA_FROM_DEVICE);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1468
			ps_page->dma = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1469
			put_page(ps_page->page);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1470
			ps_page->page = NULL;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1471
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1472
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1473
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1474
	/* there also may be some cached data from a chained receive */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1475
	if (rx_ring->rx_skb_top) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1476
		dev_kfree_skb(rx_ring->rx_skb_top);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1477
		rx_ring->rx_skb_top = NULL;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1478
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1479
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1480
	/* Zero out the descriptor ring */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1481
	memset(rx_ring->desc, 0, rx_ring->size);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1482
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1483
	rx_ring->next_to_clean = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1484
	rx_ring->next_to_use = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1485
	adapter->flags2 &= ~FLAG2_IS_DISCARDING;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1486
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1487
	writel(0, adapter->hw.hw_addr + rx_ring->head);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1488
	writel(0, adapter->hw.hw_addr + rx_ring->tail);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1489
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1490
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1491
static void e1000e_downshift_workaround(struct work_struct *work)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1492
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1493
	struct e1000_adapter *adapter = container_of(work,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1494
					struct e1000_adapter, downshift_task);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1495
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1496
	e1000e_gig_downshift_workaround_ich8lan(&adapter->hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1497
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1498
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1499
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1500
 * e1000_intr_msi - Interrupt Handler
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1501
 * @irq: interrupt number
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1502
 * @data: pointer to a network interface device structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1503
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1504
static irqreturn_t e1000_intr_msi(int irq, void *data)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1505
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1506
	struct net_device *netdev = data;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1507
	struct e1000_adapter *adapter = netdev_priv(netdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1508
	struct e1000_hw *hw = &adapter->hw;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1509
	u32 icr = er32(ICR);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1510
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1511
	/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1512
	 * read ICR disables interrupts using IAM
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1513
	 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1514
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1515
	if (icr & E1000_ICR_LSC) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1516
		hw->mac.get_link_status = 1;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1517
		/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1518
		 * ICH8 workaround-- Call gig speed drop workaround on cable
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1519
		 * disconnect (LSC) before accessing any PHY registers
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1520
		 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1521
		if ((adapter->flags & FLAG_LSC_GIG_SPEED_DROP) &&
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1522
		    (!(er32(STATUS) & E1000_STATUS_LU)))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1523
			schedule_work(&adapter->downshift_task);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1524
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1525
		/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1526
		 * 80003ES2LAN workaround-- For packet buffer work-around on
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1527
		 * link down event; disable receives here in the ISR and reset
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1528
		 * adapter in watchdog
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1529
		 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1530
		if (netif_carrier_ok(netdev) &&
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1531
		    adapter->flags & FLAG_RX_NEEDS_RESTART) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1532
			/* disable receives */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1533
			u32 rctl = er32(RCTL);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1534
			ew32(RCTL, rctl & ~E1000_RCTL_EN);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1535
			adapter->flags |= FLAG_RX_RESTART_NOW;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1536
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1537
		/* guard against interrupt when we're going down */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1538
		if (!test_bit(__E1000_DOWN, &adapter->state))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1539
			mod_timer(&adapter->watchdog_timer, jiffies + 1);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1540
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1541
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1542
	if (napi_schedule_prep(&adapter->napi)) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1543
		adapter->total_tx_bytes = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1544
		adapter->total_tx_packets = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1545
		adapter->total_rx_bytes = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1546
		adapter->total_rx_packets = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1547
		__napi_schedule(&adapter->napi);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1548
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1549
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1550
	return IRQ_HANDLED;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1551
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1552
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1553
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1554
 * e1000_intr - Interrupt Handler
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1555
 * @irq: interrupt number
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1556
 * @data: pointer to a network interface device structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1557
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1558
static irqreturn_t e1000_intr(int irq, void *data)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1559
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1560
	struct net_device *netdev = data;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1561
	struct e1000_adapter *adapter = netdev_priv(netdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1562
	struct e1000_hw *hw = &adapter->hw;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1563
	u32 rctl, icr = er32(ICR);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1564
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1565
	if (!icr || test_bit(__E1000_DOWN, &adapter->state))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1566
		return IRQ_NONE;  /* Not our interrupt */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1567
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1568
	/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1569
	 * IMS will not auto-mask if INT_ASSERTED is not set, and if it is
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1570
	 * not set, then the adapter didn't send an interrupt
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1571
	 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1572
	if (!(icr & E1000_ICR_INT_ASSERTED))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1573
		return IRQ_NONE;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1574
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1575
	/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1576
	 * Interrupt Auto-Mask...upon reading ICR,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1577
	 * interrupts are masked.  No need for the
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1578
	 * IMC write
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1579
	 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1580
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1581
	if (icr & E1000_ICR_LSC) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1582
		hw->mac.get_link_status = 1;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1583
		/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1584
		 * ICH8 workaround-- Call gig speed drop workaround on cable
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1585
		 * disconnect (LSC) before accessing any PHY registers
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1586
		 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1587
		if ((adapter->flags & FLAG_LSC_GIG_SPEED_DROP) &&
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1588
		    (!(er32(STATUS) & E1000_STATUS_LU)))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1589
			schedule_work(&adapter->downshift_task);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1590
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1591
		/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1592
		 * 80003ES2LAN workaround--
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1593
		 * For packet buffer work-around on link down event;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1594
		 * disable receives here in the ISR and
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1595
		 * reset adapter in watchdog
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1596
		 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1597
		if (netif_carrier_ok(netdev) &&
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1598
		    (adapter->flags & FLAG_RX_NEEDS_RESTART)) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1599
			/* disable receives */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1600
			rctl = er32(RCTL);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1601
			ew32(RCTL, rctl & ~E1000_RCTL_EN);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1602
			adapter->flags |= FLAG_RX_RESTART_NOW;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1603
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1604
		/* guard against interrupt when we're going down */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1605
		if (!test_bit(__E1000_DOWN, &adapter->state))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1606
			mod_timer(&adapter->watchdog_timer, jiffies + 1);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1607
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1608
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1609
	if (napi_schedule_prep(&adapter->napi)) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1610
		adapter->total_tx_bytes = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1611
		adapter->total_tx_packets = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1612
		adapter->total_rx_bytes = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1613
		adapter->total_rx_packets = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1614
		__napi_schedule(&adapter->napi);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1615
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1616
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1617
	return IRQ_HANDLED;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1618
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1619
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1620
static irqreturn_t e1000_msix_other(int irq, void *data)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1621
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1622
	struct net_device *netdev = data;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1623
	struct e1000_adapter *adapter = netdev_priv(netdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1624
	struct e1000_hw *hw = &adapter->hw;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1625
	u32 icr = er32(ICR);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1626
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1627
	if (!(icr & E1000_ICR_INT_ASSERTED)) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1628
		if (!test_bit(__E1000_DOWN, &adapter->state))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1629
			ew32(IMS, E1000_IMS_OTHER);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1630
		return IRQ_NONE;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1631
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1632
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1633
	if (icr & adapter->eiac_mask)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1634
		ew32(ICS, (icr & adapter->eiac_mask));
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1635
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1636
	if (icr & E1000_ICR_OTHER) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1637
		if (!(icr & E1000_ICR_LSC))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1638
			goto no_link_interrupt;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1639
		hw->mac.get_link_status = 1;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1640
		/* guard against interrupt when we're going down */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1641
		if (!test_bit(__E1000_DOWN, &adapter->state))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1642
			mod_timer(&adapter->watchdog_timer, jiffies + 1);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1643
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1644
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1645
no_link_interrupt:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1646
	if (!test_bit(__E1000_DOWN, &adapter->state))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1647
		ew32(IMS, E1000_IMS_LSC | E1000_IMS_OTHER);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1648
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1649
	return IRQ_HANDLED;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1650
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1651
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1652
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1653
static irqreturn_t e1000_intr_msix_tx(int irq, void *data)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1654
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1655
	struct net_device *netdev = data;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1656
	struct e1000_adapter *adapter = netdev_priv(netdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1657
	struct e1000_hw *hw = &adapter->hw;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1658
	struct e1000_ring *tx_ring = adapter->tx_ring;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1659
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1660
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1661
	adapter->total_tx_bytes = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1662
	adapter->total_tx_packets = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1663
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1664
	if (!e1000_clean_tx_irq(adapter))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1665
		/* Ring was not completely cleaned, so fire another interrupt */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1666
		ew32(ICS, tx_ring->ims_val);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1667
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1668
	return IRQ_HANDLED;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1669
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1670
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1671
static irqreturn_t e1000_intr_msix_rx(int irq, void *data)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1672
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1673
	struct net_device *netdev = data;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1674
	struct e1000_adapter *adapter = netdev_priv(netdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1675
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1676
	/* Write the ITR value calculated at the end of the
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1677
	 * previous interrupt.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1678
	 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1679
	if (adapter->rx_ring->set_itr) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1680
		writel(1000000000 / (adapter->rx_ring->itr_val * 256),
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1681
		       adapter->hw.hw_addr + adapter->rx_ring->itr_register);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1682
		adapter->rx_ring->set_itr = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1683
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1684
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1685
	if (napi_schedule_prep(&adapter->napi)) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1686
		adapter->total_rx_bytes = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1687
		adapter->total_rx_packets = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1688
		__napi_schedule(&adapter->napi);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1689
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1690
	return IRQ_HANDLED;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1691
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1692
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1693
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1694
 * e1000_configure_msix - Configure MSI-X hardware
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1695
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1696
 * e1000_configure_msix sets up the hardware to properly
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1697
 * generate MSI-X interrupts.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1698
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1699
static void e1000_configure_msix(struct e1000_adapter *adapter)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1700
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1701
	struct e1000_hw *hw = &adapter->hw;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1702
	struct e1000_ring *rx_ring = adapter->rx_ring;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1703
	struct e1000_ring *tx_ring = adapter->tx_ring;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1704
	int vector = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1705
	u32 ctrl_ext, ivar = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1706
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1707
	adapter->eiac_mask = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1708
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1709
	/* Workaround issue with spurious interrupts on 82574 in MSI-X mode */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1710
	if (hw->mac.type == e1000_82574) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1711
		u32 rfctl = er32(RFCTL);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1712
		rfctl |= E1000_RFCTL_ACK_DIS;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1713
		ew32(RFCTL, rfctl);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1714
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1715
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1716
#define E1000_IVAR_INT_ALLOC_VALID	0x8
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1717
	/* Configure Rx vector */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1718
	rx_ring->ims_val = E1000_IMS_RXQ0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1719
	adapter->eiac_mask |= rx_ring->ims_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1720
	if (rx_ring->itr_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1721
		writel(1000000000 / (rx_ring->itr_val * 256),
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1722
		       hw->hw_addr + rx_ring->itr_register);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1723
	else
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1724
		writel(1, hw->hw_addr + rx_ring->itr_register);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1725
	ivar = E1000_IVAR_INT_ALLOC_VALID | vector;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1726
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1727
	/* Configure Tx vector */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1728
	tx_ring->ims_val = E1000_IMS_TXQ0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1729
	vector++;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1730
	if (tx_ring->itr_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1731
		writel(1000000000 / (tx_ring->itr_val * 256),
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1732
		       hw->hw_addr + tx_ring->itr_register);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1733
	else
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1734
		writel(1, hw->hw_addr + tx_ring->itr_register);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1735
	adapter->eiac_mask |= tx_ring->ims_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1736
	ivar |= ((E1000_IVAR_INT_ALLOC_VALID | vector) << 8);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1737
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1738
	/* set vector for Other Causes, e.g. link changes */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1739
	vector++;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1740
	ivar |= ((E1000_IVAR_INT_ALLOC_VALID | vector) << 16);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1741
	if (rx_ring->itr_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1742
		writel(1000000000 / (rx_ring->itr_val * 256),
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1743
		       hw->hw_addr + E1000_EITR_82574(vector));
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1744
	else
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1745
		writel(1, hw->hw_addr + E1000_EITR_82574(vector));
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1746
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1747
	/* Cause Tx interrupts on every write back */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1748
	ivar |= (1 << 31);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1749
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1750
	ew32(IVAR, ivar);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1751
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1752
	/* enable MSI-X PBA support */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1753
	ctrl_ext = er32(CTRL_EXT);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1754
	ctrl_ext |= E1000_CTRL_EXT_PBA_CLR;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1755
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1756
	/* Auto-Mask Other interrupts upon ICR read */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1757
#define E1000_EIAC_MASK_82574   0x01F00000
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1758
	ew32(IAM, ~E1000_EIAC_MASK_82574 | E1000_IMS_OTHER);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1759
	ctrl_ext |= E1000_CTRL_EXT_EIAME;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1760
	ew32(CTRL_EXT, ctrl_ext);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1761
	e1e_flush();
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1762
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1763
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1764
void e1000e_reset_interrupt_capability(struct e1000_adapter *adapter)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1765
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1766
	if (adapter->msix_entries) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1767
		pci_disable_msix(adapter->pdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1768
		kfree(adapter->msix_entries);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1769
		adapter->msix_entries = NULL;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1770
	} else if (adapter->flags & FLAG_MSI_ENABLED) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1771
		pci_disable_msi(adapter->pdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1772
		adapter->flags &= ~FLAG_MSI_ENABLED;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1773
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1774
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1775
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1776
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1777
 * e1000e_set_interrupt_capability - set MSI or MSI-X if supported
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1778
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1779
 * Attempt to configure interrupts using the best available
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1780
 * capabilities of the hardware and kernel.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1781
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1782
void e1000e_set_interrupt_capability(struct e1000_adapter *adapter)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1783
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1784
	int err;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1785
	int numvecs, i;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1786
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1787
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1788
	switch (adapter->int_mode) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1789
	case E1000E_INT_MODE_MSIX:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1790
		if (adapter->flags & FLAG_HAS_MSIX) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1791
			numvecs = 3; /* RxQ0, TxQ0 and other */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1792
			adapter->msix_entries = kcalloc(numvecs,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1793
						      sizeof(struct msix_entry),
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1794
						      GFP_KERNEL);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1795
			if (adapter->msix_entries) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1796
				for (i = 0; i < numvecs; i++)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1797
					adapter->msix_entries[i].entry = i;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1798
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1799
				err = pci_enable_msix(adapter->pdev,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1800
						      adapter->msix_entries,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1801
						      numvecs);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1802
				if (err == 0)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1803
					return;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1804
			}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1805
			/* MSI-X failed, so fall through and try MSI */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1806
			e_err("Failed to initialize MSI-X interrupts.  "
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1807
			      "Falling back to MSI interrupts.\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1808
			e1000e_reset_interrupt_capability(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1809
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1810
		adapter->int_mode = E1000E_INT_MODE_MSI;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1811
		/* Fall through */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1812
	case E1000E_INT_MODE_MSI:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1813
		if (!pci_enable_msi(adapter->pdev)) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1814
			adapter->flags |= FLAG_MSI_ENABLED;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1815
		} else {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1816
			adapter->int_mode = E1000E_INT_MODE_LEGACY;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1817
			e_err("Failed to initialize MSI interrupts.  Falling "
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1818
			      "back to legacy interrupts.\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1819
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1820
		/* Fall through */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1821
	case E1000E_INT_MODE_LEGACY:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1822
		/* Don't do anything; this is the system default */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1823
		break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1824
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1825
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1826
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1827
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1828
 * e1000_request_msix - Initialize MSI-X interrupts
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1829
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1830
 * e1000_request_msix allocates MSI-X vectors and requests interrupts from the
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1831
 * kernel.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1832
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1833
static int e1000_request_msix(struct e1000_adapter *adapter)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1834
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1835
	struct net_device *netdev = adapter->netdev;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1836
	int err = 0, vector = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1837
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1838
	if (strlen(netdev->name) < (IFNAMSIZ - 5))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1839
		sprintf(adapter->rx_ring->name, "%s-rx-0", netdev->name);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1840
	else
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1841
		memcpy(adapter->rx_ring->name, netdev->name, IFNAMSIZ);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1842
	err = request_irq(adapter->msix_entries[vector].vector,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1843
			  e1000_intr_msix_rx, 0, adapter->rx_ring->name,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1844
			  netdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1845
	if (err)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1846
		goto out;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1847
	adapter->rx_ring->itr_register = E1000_EITR_82574(vector);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1848
	adapter->rx_ring->itr_val = adapter->itr;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1849
	vector++;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1850
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1851
	if (strlen(netdev->name) < (IFNAMSIZ - 5))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1852
		sprintf(adapter->tx_ring->name, "%s-tx-0", netdev->name);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1853
	else
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1854
		memcpy(adapter->tx_ring->name, netdev->name, IFNAMSIZ);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1855
	err = request_irq(adapter->msix_entries[vector].vector,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1856
			  e1000_intr_msix_tx, 0, adapter->tx_ring->name,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1857
			  netdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1858
	if (err)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1859
		goto out;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1860
	adapter->tx_ring->itr_register = E1000_EITR_82574(vector);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1861
	adapter->tx_ring->itr_val = adapter->itr;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1862
	vector++;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1863
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1864
	err = request_irq(adapter->msix_entries[vector].vector,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1865
			  e1000_msix_other, 0, netdev->name, netdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1866
	if (err)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1867
		goto out;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1868
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1869
	e1000_configure_msix(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1870
	return 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1871
out:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1872
	return err;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1873
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1874
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1875
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1876
 * e1000_request_irq - initialize interrupts
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1877
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1878
 * Attempts to configure interrupts using the best available
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1879
 * capabilities of the hardware and kernel.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1880
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1881
static int e1000_request_irq(struct e1000_adapter *adapter)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1882
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1883
	struct net_device *netdev = adapter->netdev;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1884
	int err;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1885
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1886
	if (adapter->msix_entries) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1887
		err = e1000_request_msix(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1888
		if (!err)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1889
			return err;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1890
		/* fall back to MSI */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1891
		e1000e_reset_interrupt_capability(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1892
		adapter->int_mode = E1000E_INT_MODE_MSI;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1893
		e1000e_set_interrupt_capability(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1894
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1895
	if (adapter->flags & FLAG_MSI_ENABLED) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1896
		err = request_irq(adapter->pdev->irq, e1000_intr_msi, 0,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1897
				  netdev->name, netdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1898
		if (!err)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1899
			return err;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1900
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1901
		/* fall back to legacy interrupt */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1902
		e1000e_reset_interrupt_capability(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1903
		adapter->int_mode = E1000E_INT_MODE_LEGACY;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1904
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1905
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1906
	err = request_irq(adapter->pdev->irq, e1000_intr, IRQF_SHARED,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1907
			  netdev->name, netdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1908
	if (err)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1909
		e_err("Unable to allocate interrupt, Error: %d\n", err);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1910
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1911
	return err;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1912
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1913
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1914
static void e1000_free_irq(struct e1000_adapter *adapter)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1915
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1916
	struct net_device *netdev = adapter->netdev;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1917
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1918
	if (adapter->msix_entries) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1919
		int vector = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1920
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1921
		free_irq(adapter->msix_entries[vector].vector, netdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1922
		vector++;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1923
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1924
		free_irq(adapter->msix_entries[vector].vector, netdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1925
		vector++;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1926
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1927
		/* Other Causes interrupt vector */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1928
		free_irq(adapter->msix_entries[vector].vector, netdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1929
		return;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1930
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1931
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1932
	free_irq(adapter->pdev->irq, netdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1933
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1934
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1935
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1936
 * e1000_irq_disable - Mask off interrupt generation on the NIC
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1937
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1938
static void e1000_irq_disable(struct e1000_adapter *adapter)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1939
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1940
	struct e1000_hw *hw = &adapter->hw;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1941
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1942
	ew32(IMC, ~0);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1943
	if (adapter->msix_entries)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1944
		ew32(EIAC_82574, 0);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1945
	e1e_flush();
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1946
	synchronize_irq(adapter->pdev->irq);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1947
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1948
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1949
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1950
 * e1000_irq_enable - Enable default interrupt generation settings
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1951
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1952
static void e1000_irq_enable(struct e1000_adapter *adapter)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1953
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1954
	struct e1000_hw *hw = &adapter->hw;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1955
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1956
	if (adapter->msix_entries) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1957
		ew32(EIAC_82574, adapter->eiac_mask & E1000_EIAC_MASK_82574);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1958
		ew32(IMS, adapter->eiac_mask | E1000_IMS_OTHER | E1000_IMS_LSC);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1959
	} else {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1960
		ew32(IMS, IMS_ENABLE_MASK);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1961
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1962
	e1e_flush();
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1963
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1964
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1965
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1966
 * e1000_get_hw_control - get control of the h/w from f/w
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1967
 * @adapter: address of board private structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1968
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1969
 * e1000_get_hw_control sets {CTRL_EXT|SWSM}:DRV_LOAD bit.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1970
 * For ASF and Pass Through versions of f/w this means that
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1971
 * the driver is loaded. For AMT version (only with 82573)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1972
 * of the f/w this means that the network i/f is open.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1973
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1974
static void e1000_get_hw_control(struct e1000_adapter *adapter)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1975
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1976
	struct e1000_hw *hw = &adapter->hw;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1977
	u32 ctrl_ext;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1978
	u32 swsm;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1979
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1980
	/* Let firmware know the driver has taken over */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1981
	if (adapter->flags & FLAG_HAS_SWSM_ON_LOAD) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1982
		swsm = er32(SWSM);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1983
		ew32(SWSM, swsm | E1000_SWSM_DRV_LOAD);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1984
	} else if (adapter->flags & FLAG_HAS_CTRLEXT_ON_LOAD) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1985
		ctrl_ext = er32(CTRL_EXT);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1986
		ew32(CTRL_EXT, ctrl_ext | E1000_CTRL_EXT_DRV_LOAD);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1987
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1988
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1989
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1990
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1991
 * e1000_release_hw_control - release control of the h/w to f/w
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1992
 * @adapter: address of board private structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1993
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1994
 * e1000_release_hw_control resets {CTRL_EXT|SWSM}:DRV_LOAD bit.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1995
 * For ASF and Pass Through versions of f/w this means that the
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1996
 * driver is no longer loaded. For AMT version (only with 82573) i
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1997
 * of the f/w this means that the network i/f is closed.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1998
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1999
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2000
static void e1000_release_hw_control(struct e1000_adapter *adapter)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2001
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2002
	struct e1000_hw *hw = &adapter->hw;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2003
	u32 ctrl_ext;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2004
	u32 swsm;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2005
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2006
	/* Let firmware taken over control of h/w */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2007
	if (adapter->flags & FLAG_HAS_SWSM_ON_LOAD) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2008
		swsm = er32(SWSM);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2009
		ew32(SWSM, swsm & ~E1000_SWSM_DRV_LOAD);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2010
	} else if (adapter->flags & FLAG_HAS_CTRLEXT_ON_LOAD) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2011
		ctrl_ext = er32(CTRL_EXT);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2012
		ew32(CTRL_EXT, ctrl_ext & ~E1000_CTRL_EXT_DRV_LOAD);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2013
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2014
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2015
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2016
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2017
 * @e1000_alloc_ring - allocate memory for a ring structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2018
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2019
static int e1000_alloc_ring_dma(struct e1000_adapter *adapter,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2020
				struct e1000_ring *ring)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2021
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2022
	struct pci_dev *pdev = adapter->pdev;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2023
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2024
	ring->desc = dma_alloc_coherent(&pdev->dev, ring->size, &ring->dma,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2025
					GFP_KERNEL);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2026
	if (!ring->desc)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2027
		return -ENOMEM;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2028
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2029
	return 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2030
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2031
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2032
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2033
 * e1000e_setup_tx_resources - allocate Tx resources (Descriptors)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2034
 * @adapter: board private structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2035
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2036
 * Return 0 on success, negative on failure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2037
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2038
int e1000e_setup_tx_resources(struct e1000_adapter *adapter)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2039
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2040
	struct e1000_ring *tx_ring = adapter->tx_ring;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2041
	int err = -ENOMEM, size;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2042
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2043
	size = sizeof(struct e1000_buffer) * tx_ring->count;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2044
	tx_ring->buffer_info = vmalloc(size);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2045
	if (!tx_ring->buffer_info)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2046
		goto err;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2047
	memset(tx_ring->buffer_info, 0, size);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2048
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2049
	/* round up to nearest 4K */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2050
	tx_ring->size = tx_ring->count * sizeof(struct e1000_tx_desc);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2051
	tx_ring->size = ALIGN(tx_ring->size, 4096);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2052
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2053
	err = e1000_alloc_ring_dma(adapter, tx_ring);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2054
	if (err)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2055
		goto err;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2056
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2057
	tx_ring->next_to_use = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2058
	tx_ring->next_to_clean = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2059
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2060
	return 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2061
err:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2062
	vfree(tx_ring->buffer_info);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2063
	e_err("Unable to allocate memory for the transmit descriptor ring\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2064
	return err;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2065
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2066
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2067
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2068
 * e1000e_setup_rx_resources - allocate Rx resources (Descriptors)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2069
 * @adapter: board private structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2070
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2071
 * Returns 0 on success, negative on failure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2072
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2073
int e1000e_setup_rx_resources(struct e1000_adapter *adapter)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2074
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2075
	struct e1000_ring *rx_ring = adapter->rx_ring;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2076
	struct e1000_buffer *buffer_info;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2077
	int i, size, desc_len, err = -ENOMEM;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2078
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2079
	size = sizeof(struct e1000_buffer) * rx_ring->count;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2080
	rx_ring->buffer_info = vmalloc(size);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2081
	if (!rx_ring->buffer_info)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2082
		goto err;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2083
	memset(rx_ring->buffer_info, 0, size);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2084
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2085
	for (i = 0; i < rx_ring->count; i++) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2086
		buffer_info = &rx_ring->buffer_info[i];
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2087
		buffer_info->ps_pages = kcalloc(PS_PAGE_BUFFERS,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2088
						sizeof(struct e1000_ps_page),
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2089
						GFP_KERNEL);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2090
		if (!buffer_info->ps_pages)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2091
			goto err_pages;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2092
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2093
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2094
	desc_len = sizeof(union e1000_rx_desc_packet_split);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2095
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2096
	/* Round up to nearest 4K */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2097
	rx_ring->size = rx_ring->count * desc_len;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2098
	rx_ring->size = ALIGN(rx_ring->size, 4096);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2099
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2100
	err = e1000_alloc_ring_dma(adapter, rx_ring);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2101
	if (err)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2102
		goto err_pages;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2103
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2104
	rx_ring->next_to_clean = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2105
	rx_ring->next_to_use = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2106
	rx_ring->rx_skb_top = NULL;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2107
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2108
	return 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2109
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2110
err_pages:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2111
	for (i = 0; i < rx_ring->count; i++) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2112
		buffer_info = &rx_ring->buffer_info[i];
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2113
		kfree(buffer_info->ps_pages);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2114
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2115
err:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2116
	vfree(rx_ring->buffer_info);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2117
	e_err("Unable to allocate memory for the transmit descriptor ring\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2118
	return err;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2119
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2120
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2121
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2122
 * e1000_clean_tx_ring - Free Tx Buffers
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2123
 * @adapter: board private structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2124
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2125
static void e1000_clean_tx_ring(struct e1000_adapter *adapter)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2126
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2127
	struct e1000_ring *tx_ring = adapter->tx_ring;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2128
	struct e1000_buffer *buffer_info;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2129
	unsigned long size;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2130
	unsigned int i;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2131
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2132
	for (i = 0; i < tx_ring->count; i++) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2133
		buffer_info = &tx_ring->buffer_info[i];
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2134
		e1000_put_txbuf(adapter, buffer_info);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2135
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2136
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2137
	size = sizeof(struct e1000_buffer) * tx_ring->count;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2138
	memset(tx_ring->buffer_info, 0, size);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2139
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2140
	memset(tx_ring->desc, 0, tx_ring->size);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2141
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2142
	tx_ring->next_to_use = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2143
	tx_ring->next_to_clean = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2144
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2145
	writel(0, adapter->hw.hw_addr + tx_ring->head);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2146
	writel(0, adapter->hw.hw_addr + tx_ring->tail);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2147
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2148
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2149
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2150
 * e1000e_free_tx_resources - Free Tx Resources per Queue
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2151
 * @adapter: board private structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2152
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2153
 * Free all transmit software resources
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2154
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2155
void e1000e_free_tx_resources(struct e1000_adapter *adapter)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2156
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2157
	struct pci_dev *pdev = adapter->pdev;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2158
	struct e1000_ring *tx_ring = adapter->tx_ring;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2159
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2160
	e1000_clean_tx_ring(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2161
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2162
	vfree(tx_ring->buffer_info);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2163
	tx_ring->buffer_info = NULL;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2164
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2165
	dma_free_coherent(&pdev->dev, tx_ring->size, tx_ring->desc,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2166
			  tx_ring->dma);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2167
	tx_ring->desc = NULL;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2168
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2169
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2170
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2171
 * e1000e_free_rx_resources - Free Rx Resources
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2172
 * @adapter: board private structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2173
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2174
 * Free all receive software resources
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2175
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2176
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2177
void e1000e_free_rx_resources(struct e1000_adapter *adapter)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2178
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2179
	struct pci_dev *pdev = adapter->pdev;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2180
	struct e1000_ring *rx_ring = adapter->rx_ring;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2181
	int i;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2182
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2183
	e1000_clean_rx_ring(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2184
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2185
	for (i = 0; i < rx_ring->count; i++) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2186
		kfree(rx_ring->buffer_info[i].ps_pages);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2187
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2188
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2189
	vfree(rx_ring->buffer_info);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2190
	rx_ring->buffer_info = NULL;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2191
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2192
	dma_free_coherent(&pdev->dev, rx_ring->size, rx_ring->desc,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2193
			  rx_ring->dma);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2194
	rx_ring->desc = NULL;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2195
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2196
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2197
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2198
 * e1000_update_itr - update the dynamic ITR value based on statistics
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2199
 * @adapter: pointer to adapter
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2200
 * @itr_setting: current adapter->itr
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2201
 * @packets: the number of packets during this measurement interval
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2202
 * @bytes: the number of bytes during this measurement interval
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2203
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2204
 *      Stores a new ITR value based on packets and byte
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2205
 *      counts during the last interrupt.  The advantage of per interrupt
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2206
 *      computation is faster updates and more accurate ITR for the current
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2207
 *      traffic pattern.  Constants in this function were computed
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2208
 *      based on theoretical maximum wire speed and thresholds were set based
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2209
 *      on testing data as well as attempting to minimize response time
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2210
 *      while increasing bulk throughput.  This functionality is controlled
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2211
 *      by the InterruptThrottleRate module parameter.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2212
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2213
static unsigned int e1000_update_itr(struct e1000_adapter *adapter,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2214
				     u16 itr_setting, int packets,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2215
				     int bytes)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2216
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2217
	unsigned int retval = itr_setting;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2218
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2219
	if (packets == 0)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2220
		goto update_itr_done;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2221
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2222
	switch (itr_setting) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2223
	case lowest_latency:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2224
		/* handle TSO and jumbo frames */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2225
		if (bytes/packets > 8000)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2226
			retval = bulk_latency;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2227
		else if ((packets < 5) && (bytes > 512)) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2228
			retval = low_latency;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2229
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2230
		break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2231
	case low_latency:  /* 50 usec aka 20000 ints/s */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2232
		if (bytes > 10000) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2233
			/* this if handles the TSO accounting */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2234
			if (bytes/packets > 8000) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2235
				retval = bulk_latency;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2236
			} else if ((packets < 10) || ((bytes/packets) > 1200)) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2237
				retval = bulk_latency;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2238
			} else if ((packets > 35)) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2239
				retval = lowest_latency;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2240
			}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2241
		} else if (bytes/packets > 2000) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2242
			retval = bulk_latency;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2243
		} else if (packets <= 2 && bytes < 512) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2244
			retval = lowest_latency;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2245
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2246
		break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2247
	case bulk_latency: /* 250 usec aka 4000 ints/s */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2248
		if (bytes > 25000) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2249
			if (packets > 35) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2250
				retval = low_latency;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2251
			}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2252
		} else if (bytes < 6000) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2253
			retval = low_latency;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2254
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2255
		break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2256
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2257
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2258
update_itr_done:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2259
	return retval;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2260
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2261
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2262
static void e1000_set_itr(struct e1000_adapter *adapter)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2263
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2264
	struct e1000_hw *hw = &adapter->hw;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2265
	u16 current_itr;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2266
	u32 new_itr = adapter->itr;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2267
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2268
	/* for non-gigabit speeds, just fix the interrupt rate at 4000 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2269
	if (adapter->link_speed != SPEED_1000) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2270
		current_itr = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2271
		new_itr = 4000;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2272
		goto set_itr_now;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2273
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2274
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2275
	adapter->tx_itr = e1000_update_itr(adapter,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2276
				    adapter->tx_itr,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2277
				    adapter->total_tx_packets,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2278
				    adapter->total_tx_bytes);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2279
	/* conservative mode (itr 3) eliminates the lowest_latency setting */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2280
	if (adapter->itr_setting == 3 && adapter->tx_itr == lowest_latency)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2281
		adapter->tx_itr = low_latency;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2282
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2283
	adapter->rx_itr = e1000_update_itr(adapter,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2284
				    adapter->rx_itr,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2285
				    adapter->total_rx_packets,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2286
				    adapter->total_rx_bytes);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2287
	/* conservative mode (itr 3) eliminates the lowest_latency setting */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2288
	if (adapter->itr_setting == 3 && adapter->rx_itr == lowest_latency)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2289
		adapter->rx_itr = low_latency;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2290
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2291
	current_itr = max(adapter->rx_itr, adapter->tx_itr);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2292
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2293
	switch (current_itr) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2294
	/* counts and packets in update_itr are dependent on these numbers */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2295
	case lowest_latency:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2296
		new_itr = 70000;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2297
		break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2298
	case low_latency:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2299
		new_itr = 20000; /* aka hwitr = ~200 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2300
		break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2301
	case bulk_latency:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2302
		new_itr = 4000;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2303
		break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2304
	default:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2305
		break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2306
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2307
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2308
set_itr_now:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2309
	if (new_itr != adapter->itr) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2310
		/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2311
		 * this attempts to bias the interrupt rate towards Bulk
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2312
		 * by adding intermediate steps when interrupt rate is
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2313
		 * increasing
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2314
		 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2315
		new_itr = new_itr > adapter->itr ?
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2316
			     min(adapter->itr + (new_itr >> 2), new_itr) :
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2317
			     new_itr;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2318
		adapter->itr = new_itr;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2319
		adapter->rx_ring->itr_val = new_itr;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2320
		if (adapter->msix_entries)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2321
			adapter->rx_ring->set_itr = 1;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2322
		else
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2323
			ew32(ITR, 1000000000 / (new_itr * 256));
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2324
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2325
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2326
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2327
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2328
 * e1000_alloc_queues - Allocate memory for all rings
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2329
 * @adapter: board private structure to initialize
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2330
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2331
static int __devinit e1000_alloc_queues(struct e1000_adapter *adapter)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2332
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2333
	adapter->tx_ring = kzalloc(sizeof(struct e1000_ring), GFP_KERNEL);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2334
	if (!adapter->tx_ring)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2335
		goto err;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2336
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2337
	adapter->rx_ring = kzalloc(sizeof(struct e1000_ring), GFP_KERNEL);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2338
	if (!adapter->rx_ring)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2339
		goto err;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2340
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2341
	return 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2342
err:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2343
	e_err("Unable to allocate memory for queues\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2344
	kfree(adapter->rx_ring);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2345
	kfree(adapter->tx_ring);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2346
	return -ENOMEM;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2347
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2348
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2349
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2350
 * e1000_clean - NAPI Rx polling callback
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2351
 * @napi: struct associated with this polling callback
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2352
 * @budget: amount of packets driver is allowed to process this poll
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2353
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2354
static int e1000_clean(struct napi_struct *napi, int budget)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2355
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2356
	struct e1000_adapter *adapter = container_of(napi, struct e1000_adapter, napi);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2357
	struct e1000_hw *hw = &adapter->hw;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2358
	struct net_device *poll_dev = adapter->netdev;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2359
	int tx_cleaned = 1, work_done = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2360
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2361
	adapter = netdev_priv(poll_dev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2362
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2363
	if (adapter->msix_entries &&
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2364
	    !(adapter->rx_ring->ims_val & adapter->tx_ring->ims_val))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2365
		goto clean_rx;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2366
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2367
	tx_cleaned = e1000_clean_tx_irq(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2368
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2369
clean_rx:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2370
	adapter->clean_rx(adapter, &work_done, budget);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2371
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2372
	if (!tx_cleaned)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2373
		work_done = budget;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2374
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2375
	/* If budget not fully consumed, exit the polling mode */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2376
	if (work_done < budget) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2377
		if (adapter->itr_setting & 3)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2378
			e1000_set_itr(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2379
		napi_complete(napi);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2380
		if (!test_bit(__E1000_DOWN, &adapter->state)) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2381
			if (adapter->msix_entries)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2382
				ew32(IMS, adapter->rx_ring->ims_val);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2383
			else
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2384
				e1000_irq_enable(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2385
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2386
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2387
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2388
	return work_done;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2389
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2390
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2391
static void e1000_vlan_rx_add_vid(struct net_device *netdev, u16 vid)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2392
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2393
	struct e1000_adapter *adapter = netdev_priv(netdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2394
	struct e1000_hw *hw = &adapter->hw;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2395
	u32 vfta, index;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2396
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2397
	/* don't update vlan cookie if already programmed */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2398
	if ((adapter->hw.mng_cookie.status &
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2399
	     E1000_MNG_DHCP_COOKIE_STATUS_VLAN) &&
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2400
	    (vid == adapter->mng_vlan_id))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2401
		return;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2402
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2403
	/* add VID to filter table */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2404
	if (adapter->flags & FLAG_HAS_HW_VLAN_FILTER) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2405
		index = (vid >> 5) & 0x7F;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2406
		vfta = E1000_READ_REG_ARRAY(hw, E1000_VFTA, index);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2407
		vfta |= (1 << (vid & 0x1F));
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2408
		hw->mac.ops.write_vfta(hw, index, vfta);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2409
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2410
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2411
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2412
static void e1000_vlan_rx_kill_vid(struct net_device *netdev, u16 vid)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2413
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2414
	struct e1000_adapter *adapter = netdev_priv(netdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2415
	struct e1000_hw *hw = &adapter->hw;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2416
	u32 vfta, index;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2417
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2418
	if (!test_bit(__E1000_DOWN, &adapter->state))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2419
		e1000_irq_disable(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2420
	vlan_group_set_device(adapter->vlgrp, vid, NULL);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2421
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2422
	if (!test_bit(__E1000_DOWN, &adapter->state))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2423
		e1000_irq_enable(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2424
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2425
	if ((adapter->hw.mng_cookie.status &
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2426
	     E1000_MNG_DHCP_COOKIE_STATUS_VLAN) &&
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2427
	    (vid == adapter->mng_vlan_id)) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2428
		/* release control to f/w */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2429
		e1000_release_hw_control(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2430
		return;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2431
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2432
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2433
	/* remove VID from filter table */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2434
	if (adapter->flags & FLAG_HAS_HW_VLAN_FILTER) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2435
		index = (vid >> 5) & 0x7F;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2436
		vfta = E1000_READ_REG_ARRAY(hw, E1000_VFTA, index);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2437
		vfta &= ~(1 << (vid & 0x1F));
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2438
		hw->mac.ops.write_vfta(hw, index, vfta);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2439
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2440
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2441
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2442
static void e1000_update_mng_vlan(struct e1000_adapter *adapter)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2443
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2444
	struct net_device *netdev = adapter->netdev;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2445
	u16 vid = adapter->hw.mng_cookie.vlan_id;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2446
	u16 old_vid = adapter->mng_vlan_id;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2447
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2448
	if (!adapter->vlgrp)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2449
		return;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2450
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2451
	if (!vlan_group_get_device(adapter->vlgrp, vid)) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2452
		adapter->mng_vlan_id = E1000_MNG_VLAN_NONE;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2453
		if (adapter->hw.mng_cookie.status &
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2454
			E1000_MNG_DHCP_COOKIE_STATUS_VLAN) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2455
			e1000_vlan_rx_add_vid(netdev, vid);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2456
			adapter->mng_vlan_id = vid;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2457
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2458
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2459
		if ((old_vid != (u16)E1000_MNG_VLAN_NONE) &&
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2460
				(vid != old_vid) &&
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2461
		    !vlan_group_get_device(adapter->vlgrp, old_vid))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2462
			e1000_vlan_rx_kill_vid(netdev, old_vid);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2463
	} else {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2464
		adapter->mng_vlan_id = vid;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2465
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2466
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2467
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2468
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2469
static void e1000_vlan_rx_register(struct net_device *netdev,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2470
				   struct vlan_group *grp)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2471
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2472
	struct e1000_adapter *adapter = netdev_priv(netdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2473
	struct e1000_hw *hw = &adapter->hw;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2474
	u32 ctrl, rctl;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2475
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2476
	if (!test_bit(__E1000_DOWN, &adapter->state))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2477
		e1000_irq_disable(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2478
	adapter->vlgrp = grp;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2479
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2480
	if (grp) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2481
		/* enable VLAN tag insert/strip */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2482
		ctrl = er32(CTRL);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2483
		ctrl |= E1000_CTRL_VME;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2484
		ew32(CTRL, ctrl);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2485
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2486
		if (adapter->flags & FLAG_HAS_HW_VLAN_FILTER) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2487
			/* enable VLAN receive filtering */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2488
			rctl = er32(RCTL);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2489
			rctl &= ~E1000_RCTL_CFIEN;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2490
			ew32(RCTL, rctl);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2491
			e1000_update_mng_vlan(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2492
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2493
	} else {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2494
		/* disable VLAN tag insert/strip */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2495
		ctrl = er32(CTRL);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2496
		ctrl &= ~E1000_CTRL_VME;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2497
		ew32(CTRL, ctrl);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2498
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2499
		if (adapter->flags & FLAG_HAS_HW_VLAN_FILTER) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2500
			if (adapter->mng_vlan_id !=
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2501
			    (u16)E1000_MNG_VLAN_NONE) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2502
				e1000_vlan_rx_kill_vid(netdev,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2503
						       adapter->mng_vlan_id);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2504
				adapter->mng_vlan_id = E1000_MNG_VLAN_NONE;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2505
			}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2506
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2507
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2508
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2509
	if (!test_bit(__E1000_DOWN, &adapter->state))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2510
		e1000_irq_enable(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2511
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2512
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2513
static void e1000_restore_vlan(struct e1000_adapter *adapter)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2514
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2515
	u16 vid;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2516
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2517
	e1000_vlan_rx_register(adapter->netdev, adapter->vlgrp);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2518
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2519
	if (!adapter->vlgrp)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2520
		return;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2521
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2522
	for (vid = 0; vid < VLAN_GROUP_ARRAY_LEN; vid++) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2523
		if (!vlan_group_get_device(adapter->vlgrp, vid))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2524
			continue;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2525
		e1000_vlan_rx_add_vid(adapter->netdev, vid);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2526
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2527
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2528
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2529
static void e1000_init_manageability_pt(struct e1000_adapter *adapter)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2530
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2531
	struct e1000_hw *hw = &adapter->hw;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2532
	u32 manc, manc2h, mdef, i, j;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2533
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2534
	if (!(adapter->flags & FLAG_MNG_PT_ENABLED))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2535
		return;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2536
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2537
	manc = er32(MANC);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2538
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2539
	/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2540
	 * enable receiving management packets to the host. this will probably
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2541
	 * generate destination unreachable messages from the host OS, but
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2542
	 * the packets will be handled on SMBUS
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2543
	 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2544
	manc |= E1000_MANC_EN_MNG2HOST;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2545
	manc2h = er32(MANC2H);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2546
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2547
	switch (hw->mac.type) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2548
	default:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2549
		manc2h |= (E1000_MANC2H_PORT_623 | E1000_MANC2H_PORT_664);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2550
		break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2551
	case e1000_82574:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2552
	case e1000_82583:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2553
		/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2554
		 * Check if IPMI pass-through decision filter already exists;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2555
		 * if so, enable it.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2556
		 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2557
		for (i = 0, j = 0; i < 8; i++) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2558
			mdef = er32(MDEF(i));
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2559
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2560
			/* Ignore filters with anything other than IPMI ports */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2561
			if (mdef & ~(E1000_MDEF_PORT_623 | E1000_MDEF_PORT_664))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2562
				continue;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2563
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2564
			/* Enable this decision filter in MANC2H */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2565
			if (mdef)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2566
				manc2h |= (1 << i);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2567
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2568
			j |= mdef;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2569
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2570
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2571
		if (j == (E1000_MDEF_PORT_623 | E1000_MDEF_PORT_664))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2572
			break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2573
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2574
		/* Create new decision filter in an empty filter */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2575
		for (i = 0, j = 0; i < 8; i++)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2576
			if (er32(MDEF(i)) == 0) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2577
				ew32(MDEF(i), (E1000_MDEF_PORT_623 |
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2578
					       E1000_MDEF_PORT_664));
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2579
				manc2h |= (1 << 1);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2580
				j++;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2581
				break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2582
			}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2583
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2584
		if (!j)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2585
			e_warn("Unable to create IPMI pass-through filter\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2586
		break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2587
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2588
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2589
	ew32(MANC2H, manc2h);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2590
	ew32(MANC, manc);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2591
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2592
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2593
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2594
 * e1000_configure_tx - Configure 8254x Transmit Unit after Reset
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2595
 * @adapter: board private structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2596
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2597
 * Configure the Tx unit of the MAC after a reset.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2598
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2599
static void e1000_configure_tx(struct e1000_adapter *adapter)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2600
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2601
	struct e1000_hw *hw = &adapter->hw;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2602
	struct e1000_ring *tx_ring = adapter->tx_ring;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2603
	u64 tdba;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2604
	u32 tdlen, tctl, tipg, tarc;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2605
	u32 ipgr1, ipgr2;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2606
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2607
	/* Setup the HW Tx Head and Tail descriptor pointers */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2608
	tdba = tx_ring->dma;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2609
	tdlen = tx_ring->count * sizeof(struct e1000_tx_desc);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2610
	ew32(TDBAL, (tdba & DMA_BIT_MASK(32)));
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2611
	ew32(TDBAH, (tdba >> 32));
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2612
	ew32(TDLEN, tdlen);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2613
	ew32(TDH, 0);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2614
	ew32(TDT, 0);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2615
	tx_ring->head = E1000_TDH;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2616
	tx_ring->tail = E1000_TDT;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2617
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2618
	/* Set the default values for the Tx Inter Packet Gap timer */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2619
	tipg = DEFAULT_82543_TIPG_IPGT_COPPER;          /*  8  */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2620
	ipgr1 = DEFAULT_82543_TIPG_IPGR1;               /*  8  */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2621
	ipgr2 = DEFAULT_82543_TIPG_IPGR2;               /*  6  */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2622
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2623
	if (adapter->flags & FLAG_TIPG_MEDIUM_FOR_80003ESLAN)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2624
		ipgr2 = DEFAULT_80003ES2LAN_TIPG_IPGR2; /*  7  */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2625
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2626
	tipg |= ipgr1 << E1000_TIPG_IPGR1_SHIFT;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2627
	tipg |= ipgr2 << E1000_TIPG_IPGR2_SHIFT;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2628
	ew32(TIPG, tipg);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2629
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2630
	/* Set the Tx Interrupt Delay register */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2631
	ew32(TIDV, adapter->tx_int_delay);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2632
	/* Tx irq moderation */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2633
	ew32(TADV, adapter->tx_abs_int_delay);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2634
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2635
	/* Program the Transmit Control Register */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2636
	tctl = er32(TCTL);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2637
	tctl &= ~E1000_TCTL_CT;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2638
	tctl |= E1000_TCTL_PSP | E1000_TCTL_RTLC |
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2639
		(E1000_COLLISION_THRESHOLD << E1000_CT_SHIFT);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2640
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2641
	if (adapter->flags & FLAG_TARC_SPEED_MODE_BIT) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2642
		tarc = er32(TARC(0));
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2643
		/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2644
		 * set the speed mode bit, we'll clear it if we're not at
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2645
		 * gigabit link later
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2646
		 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2647
#define SPEED_MODE_BIT (1 << 21)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2648
		tarc |= SPEED_MODE_BIT;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2649
		ew32(TARC(0), tarc);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2650
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2651
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2652
	/* errata: program both queues to unweighted RR */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2653
	if (adapter->flags & FLAG_TARC_SET_BIT_ZERO) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2654
		tarc = er32(TARC(0));
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2655
		tarc |= 1;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2656
		ew32(TARC(0), tarc);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2657
		tarc = er32(TARC(1));
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2658
		tarc |= 1;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2659
		ew32(TARC(1), tarc);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2660
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2661
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2662
	/* Setup Transmit Descriptor Settings for eop descriptor */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2663
	adapter->txd_cmd = E1000_TXD_CMD_EOP | E1000_TXD_CMD_IFCS;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2664
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2665
	/* only set IDE if we are delaying interrupts using the timers */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2666
	if (adapter->tx_int_delay)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2667
		adapter->txd_cmd |= E1000_TXD_CMD_IDE;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2668
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2669
	/* enable Report Status bit */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2670
	adapter->txd_cmd |= E1000_TXD_CMD_RS;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2671
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2672
	ew32(TCTL, tctl);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2673
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2674
	e1000e_config_collision_dist(hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2675
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2676
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2677
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2678
 * e1000_setup_rctl - configure the receive control registers
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2679
 * @adapter: Board private structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2680
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2681
#define PAGE_USE_COUNT(S) (((S) >> PAGE_SHIFT) + \
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2682
			   (((S) & (PAGE_SIZE - 1)) ? 1 : 0))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2683
static void e1000_setup_rctl(struct e1000_adapter *adapter)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2684
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2685
	struct e1000_hw *hw = &adapter->hw;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2686
	u32 rctl, rfctl;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2687
	u32 psrctl = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2688
	u32 pages = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2689
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2690
	/* Program MC offset vector base */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2691
	rctl = er32(RCTL);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2692
	rctl &= ~(3 << E1000_RCTL_MO_SHIFT);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2693
	rctl |= E1000_RCTL_EN | E1000_RCTL_BAM |
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2694
		E1000_RCTL_LBM_NO | E1000_RCTL_RDMTS_HALF |
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2695
		(adapter->hw.mac.mc_filter_type << E1000_RCTL_MO_SHIFT);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2696
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2697
	/* Do not Store bad packets */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2698
	rctl &= ~E1000_RCTL_SBP;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2699
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2700
	/* Enable Long Packet receive */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2701
	if (adapter->netdev->mtu <= ETH_DATA_LEN)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2702
		rctl &= ~E1000_RCTL_LPE;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2703
	else
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2704
		rctl |= E1000_RCTL_LPE;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2705
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2706
	/* Some systems expect that the CRC is included in SMBUS traffic. The
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2707
	 * hardware strips the CRC before sending to both SMBUS (BMC) and to
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2708
	 * host memory when this is enabled
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2709
	 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2710
	if (adapter->flags2 & FLAG2_CRC_STRIPPING)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2711
		rctl |= E1000_RCTL_SECRC;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2712
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2713
	/* Workaround Si errata on 82577 PHY - configure IPG for jumbos */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2714
	if ((hw->phy.type == e1000_phy_82577) && (rctl & E1000_RCTL_LPE)) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2715
		u16 phy_data;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2716
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2717
		e1e_rphy(hw, PHY_REG(770, 26), &phy_data);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2718
		phy_data &= 0xfff8;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2719
		phy_data |= (1 << 2);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2720
		e1e_wphy(hw, PHY_REG(770, 26), phy_data);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2721
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2722
		e1e_rphy(hw, 22, &phy_data);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2723
		phy_data &= 0x0fff;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2724
		phy_data |= (1 << 14);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2725
		e1e_wphy(hw, 0x10, 0x2823);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2726
		e1e_wphy(hw, 0x11, 0x0003);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2727
		e1e_wphy(hw, 22, phy_data);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2728
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2729
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2730
	/* Setup buffer sizes */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2731
	rctl &= ~E1000_RCTL_SZ_4096;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2732
	rctl |= E1000_RCTL_BSEX;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2733
	switch (adapter->rx_buffer_len) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2734
	case 2048:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2735
	default:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2736
		rctl |= E1000_RCTL_SZ_2048;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2737
		rctl &= ~E1000_RCTL_BSEX;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2738
		break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2739
	case 4096:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2740
		rctl |= E1000_RCTL_SZ_4096;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2741
		break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2742
	case 8192:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2743
		rctl |= E1000_RCTL_SZ_8192;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2744
		break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2745
	case 16384:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2746
		rctl |= E1000_RCTL_SZ_16384;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2747
		break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2748
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2749
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2750
	/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2751
	 * 82571 and greater support packet-split where the protocol
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2752
	 * header is placed in skb->data and the packet data is
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2753
	 * placed in pages hanging off of skb_shinfo(skb)->nr_frags.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2754
	 * In the case of a non-split, skb->data is linearly filled,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2755
	 * followed by the page buffers.  Therefore, skb->data is
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2756
	 * sized to hold the largest protocol header.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2757
	 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2758
	 * allocations using alloc_page take too long for regular MTU
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2759
	 * so only enable packet split for jumbo frames
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2760
	 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2761
	 * Using pages when the page size is greater than 16k wastes
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2762
	 * a lot of memory, since we allocate 3 pages at all times
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2763
	 * per packet.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2764
	 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2765
	pages = PAGE_USE_COUNT(adapter->netdev->mtu);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2766
	if (!(adapter->flags & FLAG_IS_ICH) && (pages <= 3) &&
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2767
	    (PAGE_SIZE <= 16384) && (rctl & E1000_RCTL_LPE))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2768
		adapter->rx_ps_pages = pages;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2769
	else
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2770
		adapter->rx_ps_pages = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2771
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2772
	if (adapter->rx_ps_pages) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2773
		/* Configure extra packet-split registers */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2774
		rfctl = er32(RFCTL);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2775
		rfctl |= E1000_RFCTL_EXTEN;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2776
		/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2777
		 * disable packet split support for IPv6 extension headers,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2778
		 * because some malformed IPv6 headers can hang the Rx
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2779
		 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2780
		rfctl |= (E1000_RFCTL_IPV6_EX_DIS |
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2781
			  E1000_RFCTL_NEW_IPV6_EXT_DIS);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2782
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2783
		ew32(RFCTL, rfctl);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2784
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2785
		/* Enable Packet split descriptors */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2786
		rctl |= E1000_RCTL_DTYP_PS;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2787
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2788
		psrctl |= adapter->rx_ps_bsize0 >>
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2789
			E1000_PSRCTL_BSIZE0_SHIFT;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2790
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2791
		switch (adapter->rx_ps_pages) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2792
		case 3:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2793
			psrctl |= PAGE_SIZE <<
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2794
				E1000_PSRCTL_BSIZE3_SHIFT;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2795
		case 2:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2796
			psrctl |= PAGE_SIZE <<
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2797
				E1000_PSRCTL_BSIZE2_SHIFT;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2798
		case 1:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2799
			psrctl |= PAGE_SIZE >>
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2800
				E1000_PSRCTL_BSIZE1_SHIFT;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2801
			break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2802
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2803
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2804
		ew32(PSRCTL, psrctl);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2805
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2806
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2807
	ew32(RCTL, rctl);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2808
	/* just started the receive unit, no need to restart */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2809
	adapter->flags &= ~FLAG_RX_RESTART_NOW;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2810
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2811
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2812
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2813
 * e1000_configure_rx - Configure Receive Unit after Reset
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2814
 * @adapter: board private structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2815
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2816
 * Configure the Rx unit of the MAC after a reset.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2817
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2818
static void e1000_configure_rx(struct e1000_adapter *adapter)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2819
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2820
	struct e1000_hw *hw = &adapter->hw;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2821
	struct e1000_ring *rx_ring = adapter->rx_ring;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2822
	u64 rdba;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2823
	u32 rdlen, rctl, rxcsum, ctrl_ext;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2824
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2825
	if (adapter->rx_ps_pages) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2826
		/* this is a 32 byte descriptor */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2827
		rdlen = rx_ring->count *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2828
			sizeof(union e1000_rx_desc_packet_split);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2829
		adapter->clean_rx = e1000_clean_rx_irq_ps;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2830
		adapter->alloc_rx_buf = e1000_alloc_rx_buffers_ps;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2831
	} else if (adapter->netdev->mtu > ETH_FRAME_LEN + ETH_FCS_LEN) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2832
		rdlen = rx_ring->count * sizeof(struct e1000_rx_desc);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2833
		adapter->clean_rx = e1000_clean_jumbo_rx_irq;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2834
		adapter->alloc_rx_buf = e1000_alloc_jumbo_rx_buffers;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2835
	} else {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2836
		rdlen = rx_ring->count * sizeof(struct e1000_rx_desc);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2837
		adapter->clean_rx = e1000_clean_rx_irq;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2838
		adapter->alloc_rx_buf = e1000_alloc_rx_buffers;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2839
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2840
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2841
	/* disable receives while setting up the descriptors */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2842
	rctl = er32(RCTL);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2843
	ew32(RCTL, rctl & ~E1000_RCTL_EN);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2844
	e1e_flush();
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2845
	msleep(10);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2846
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2847
	/* set the Receive Delay Timer Register */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2848
	ew32(RDTR, adapter->rx_int_delay);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2849
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2850
	/* irq moderation */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2851
	ew32(RADV, adapter->rx_abs_int_delay);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2852
	if (adapter->itr_setting != 0)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2853
		ew32(ITR, 1000000000 / (adapter->itr * 256));
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2854
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2855
	ctrl_ext = er32(CTRL_EXT);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2856
	/* Auto-Mask interrupts upon ICR access */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2857
	ctrl_ext |= E1000_CTRL_EXT_IAME;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2858
	ew32(IAM, 0xffffffff);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2859
	ew32(CTRL_EXT, ctrl_ext);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2860
	e1e_flush();
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2861
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2862
	/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2863
	 * Setup the HW Rx Head and Tail Descriptor Pointers and
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2864
	 * the Base and Length of the Rx Descriptor Ring
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2865
	 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2866
	rdba = rx_ring->dma;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2867
	ew32(RDBAL, (rdba & DMA_BIT_MASK(32)));
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2868
	ew32(RDBAH, (rdba >> 32));
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2869
	ew32(RDLEN, rdlen);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2870
	ew32(RDH, 0);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2871
	ew32(RDT, 0);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2872
	rx_ring->head = E1000_RDH;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2873
	rx_ring->tail = E1000_RDT;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2874
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2875
	/* Enable Receive Checksum Offload for TCP and UDP */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2876
	rxcsum = er32(RXCSUM);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2877
	if (adapter->flags & FLAG_RX_CSUM_ENABLED) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2878
		rxcsum |= E1000_RXCSUM_TUOFL;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2879
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2880
		/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2881
		 * IPv4 payload checksum for UDP fragments must be
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2882
		 * used in conjunction with packet-split.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2883
		 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2884
		if (adapter->rx_ps_pages)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2885
			rxcsum |= E1000_RXCSUM_IPPCSE;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2886
	} else {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2887
		rxcsum &= ~E1000_RXCSUM_TUOFL;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2888
		/* no need to clear IPPCSE as it defaults to 0 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2889
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2890
	ew32(RXCSUM, rxcsum);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2891
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2892
	/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2893
	 * Enable early receives on supported devices, only takes effect when
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2894
	 * packet size is equal or larger than the specified value (in 8 byte
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2895
	 * units), e.g. using jumbo frames when setting to E1000_ERT_2048
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2896
	 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2897
	if (adapter->flags & FLAG_HAS_ERT) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2898
		if (adapter->netdev->mtu > ETH_DATA_LEN) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2899
			u32 rxdctl = er32(RXDCTL(0));
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2900
			ew32(RXDCTL(0), rxdctl | 0x3);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2901
			ew32(ERT, E1000_ERT_2048 | (1 << 13));
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2902
			/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2903
			 * With jumbo frames and early-receive enabled,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2904
			 * excessive C-state transition latencies result in
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2905
			 * dropped transactions.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2906
			 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2907
			pm_qos_update_request(
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2908
				adapter->netdev->pm_qos_req, 55);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2909
		} else {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2910
			pm_qos_update_request(
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2911
				adapter->netdev->pm_qos_req,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2912
				PM_QOS_DEFAULT_VALUE);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2913
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2914
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2915
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2916
	/* Enable Receives */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2917
	ew32(RCTL, rctl);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2918
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2919
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2920
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2921
 *  e1000_update_mc_addr_list - Update Multicast addresses
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2922
 *  @hw: pointer to the HW structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2923
 *  @mc_addr_list: array of multicast addresses to program
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2924
 *  @mc_addr_count: number of multicast addresses to program
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2925
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2926
 *  Updates the Multicast Table Array.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2927
 *  The caller must have a packed mc_addr_list of multicast addresses.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2928
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2929
static void e1000_update_mc_addr_list(struct e1000_hw *hw, u8 *mc_addr_list,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2930
				      u32 mc_addr_count)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2931
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2932
	hw->mac.ops.update_mc_addr_list(hw, mc_addr_list, mc_addr_count);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2933
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2934
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2935
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2936
 * e1000_set_multi - Multicast and Promiscuous mode set
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2937
 * @netdev: network interface device structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2938
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2939
 * The set_multi entry point is called whenever the multicast address
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2940
 * list or the network interface flags are updated.  This routine is
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2941
 * responsible for configuring the hardware for proper multicast,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2942
 * promiscuous mode, and all-multi behavior.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2943
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2944
static void e1000_set_multi(struct net_device *netdev)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2945
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2946
	struct e1000_adapter *adapter = netdev_priv(netdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2947
	struct e1000_hw *hw = &adapter->hw;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2948
	struct netdev_hw_addr *ha;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2949
	u8  *mta_list;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2950
	u32 rctl;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2951
	int i;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2952
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2953
	/* Check for Promiscuous and All Multicast modes */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2954
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2955
	rctl = er32(RCTL);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2956
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2957
	if (netdev->flags & IFF_PROMISC) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2958
		rctl |= (E1000_RCTL_UPE | E1000_RCTL_MPE);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2959
		rctl &= ~E1000_RCTL_VFE;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2960
	} else {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2961
		if (netdev->flags & IFF_ALLMULTI) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2962
			rctl |= E1000_RCTL_MPE;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2963
			rctl &= ~E1000_RCTL_UPE;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2964
		} else {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2965
			rctl &= ~(E1000_RCTL_UPE | E1000_RCTL_MPE);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2966
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2967
		if (adapter->flags & FLAG_HAS_HW_VLAN_FILTER)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2968
			rctl |= E1000_RCTL_VFE;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2969
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2970
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2971
	ew32(RCTL, rctl);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2972
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2973
	if (!netdev_mc_empty(netdev)) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2974
		mta_list = kmalloc(netdev_mc_count(netdev) * 6, GFP_ATOMIC);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2975
		if (!mta_list)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2976
			return;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2977
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2978
		/* prepare a packed array of only addresses. */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2979
		i = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2980
		netdev_for_each_mc_addr(ha, netdev)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2981
			memcpy(mta_list + (i++ * ETH_ALEN), ha->addr, ETH_ALEN);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2982
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2983
		e1000_update_mc_addr_list(hw, mta_list, i);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2984
		kfree(mta_list);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2985
	} else {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2986
		/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2987
		 * if we're called from probe, we might not have
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2988
		 * anything to do here, so clear out the list
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2989
		 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2990
		e1000_update_mc_addr_list(hw, NULL, 0);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2991
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2992
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2993
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2994
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2995
 * e1000_configure - configure the hardware for Rx and Tx
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2996
 * @adapter: private board structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2997
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2998
static void e1000_configure(struct e1000_adapter *adapter)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2999
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3000
	e1000_set_multi(adapter->netdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3001
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3002
	e1000_restore_vlan(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3003
	e1000_init_manageability_pt(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3004
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3005
	e1000_configure_tx(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3006
	e1000_setup_rctl(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3007
	e1000_configure_rx(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3008
	adapter->alloc_rx_buf(adapter, e1000_desc_unused(adapter->rx_ring));
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3009
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3010
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3011
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3012
 * e1000e_power_up_phy - restore link in case the phy was powered down
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3013
 * @adapter: address of board private structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3014
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3015
 * The phy may be powered down to save power and turn off link when the
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3016
 * driver is unloaded and wake on lan is not enabled (among others)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3017
 * *** this routine MUST be followed by a call to e1000e_reset ***
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3018
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3019
void e1000e_power_up_phy(struct e1000_adapter *adapter)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3020
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3021
	if (adapter->hw.phy.ops.power_up)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3022
		adapter->hw.phy.ops.power_up(&adapter->hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3023
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3024
	adapter->hw.mac.ops.setup_link(&adapter->hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3025
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3026
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3027
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3028
 * e1000_power_down_phy - Power down the PHY
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3029
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3030
 * Power down the PHY so no link is implied when interface is down.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3031
 * The PHY cannot be powered down if management or WoL is active.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3032
 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3033
static void e1000_power_down_phy(struct e1000_adapter *adapter)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3034
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3035
	/* WoL is enabled */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3036
	if (adapter->wol)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3037
		return;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3038
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3039
	if (adapter->hw.phy.ops.power_down)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3040
		adapter->hw.phy.ops.power_down(&adapter->hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3041
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3042
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3043
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3044
 * e1000e_reset - bring the hardware into a known good state
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3045
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3046
 * This function boots the hardware and enables some settings that
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3047
 * require a configuration cycle of the hardware - those cannot be
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3048
 * set/changed during runtime. After reset the device needs to be
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3049
 * properly configured for Rx, Tx etc.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3050
 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3051
void e1000e_reset(struct e1000_adapter *adapter)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3052
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3053
	struct e1000_mac_info *mac = &adapter->hw.mac;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3054
	struct e1000_fc_info *fc = &adapter->hw.fc;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3055
	struct e1000_hw *hw = &adapter->hw;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3056
	u32 tx_space, min_tx_space, min_rx_space;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3057
	u32 pba = adapter->pba;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3058
	u16 hwm;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3059
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3060
	/* reset Packet Buffer Allocation to default */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3061
	ew32(PBA, pba);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3062
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3063
	if (adapter->max_frame_size > ETH_FRAME_LEN + ETH_FCS_LEN) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3064
		/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3065
		 * To maintain wire speed transmits, the Tx FIFO should be
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3066
		 * large enough to accommodate two full transmit packets,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3067
		 * rounded up to the next 1KB and expressed in KB.  Likewise,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3068
		 * the Rx FIFO should be large enough to accommodate at least
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3069
		 * one full receive packet and is similarly rounded up and
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3070
		 * expressed in KB.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3071
		 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3072
		pba = er32(PBA);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3073
		/* upper 16 bits has Tx packet buffer allocation size in KB */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3074
		tx_space = pba >> 16;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3075
		/* lower 16 bits has Rx packet buffer allocation size in KB */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3076
		pba &= 0xffff;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3077
		/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3078
		 * the Tx fifo also stores 16 bytes of information about the tx
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3079
		 * but don't include ethernet FCS because hardware appends it
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3080
		 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3081
		min_tx_space = (adapter->max_frame_size +
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3082
				sizeof(struct e1000_tx_desc) -
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3083
				ETH_FCS_LEN) * 2;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3084
		min_tx_space = ALIGN(min_tx_space, 1024);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3085
		min_tx_space >>= 10;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3086
		/* software strips receive CRC, so leave room for it */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3087
		min_rx_space = adapter->max_frame_size;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3088
		min_rx_space = ALIGN(min_rx_space, 1024);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3089
		min_rx_space >>= 10;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3090
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3091
		/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3092
		 * If current Tx allocation is less than the min Tx FIFO size,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3093
		 * and the min Tx FIFO size is less than the current Rx FIFO
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3094
		 * allocation, take space away from current Rx allocation
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3095
		 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3096
		if ((tx_space < min_tx_space) &&
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3097
		    ((min_tx_space - tx_space) < pba)) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3098
			pba -= min_tx_space - tx_space;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3099
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3100
			/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3101
			 * if short on Rx space, Rx wins and must trump tx
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3102
			 * adjustment or use Early Receive if available
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3103
			 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3104
			if ((pba < min_rx_space) &&
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3105
			    (!(adapter->flags & FLAG_HAS_ERT)))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3106
				/* ERT enabled in e1000_configure_rx */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3107
				pba = min_rx_space;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3108
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3109
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3110
		ew32(PBA, pba);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3111
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3112
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3113
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3114
	/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3115
	 * flow control settings
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3116
	 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3117
	 * The high water mark must be low enough to fit one full frame
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3118
	 * (or the size used for early receive) above it in the Rx FIFO.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3119
	 * Set it to the lower of:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3120
	 * - 90% of the Rx FIFO size, and
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3121
	 * - the full Rx FIFO size minus the early receive size (for parts
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3122
	 *   with ERT support assuming ERT set to E1000_ERT_2048), or
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3123
	 * - the full Rx FIFO size minus one full frame
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3124
	 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3125
	if (hw->mac.type == e1000_pchlan) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3126
		/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3127
		 * Workaround PCH LOM adapter hangs with certain network
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3128
		 * loads.  If hangs persist, try disabling Tx flow control.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3129
		 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3130
		if (adapter->netdev->mtu > ETH_DATA_LEN) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3131
			fc->high_water = 0x3500;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3132
			fc->low_water  = 0x1500;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3133
		} else {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3134
			fc->high_water = 0x5000;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3135
			fc->low_water  = 0x3000;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3136
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3137
		fc->refresh_time = 0x1000;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3138
	} else {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3139
		if ((adapter->flags & FLAG_HAS_ERT) &&
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3140
		    (adapter->netdev->mtu > ETH_DATA_LEN))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3141
			hwm = min(((pba << 10) * 9 / 10),
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3142
				  ((pba << 10) - (E1000_ERT_2048 << 3)));
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3143
		else
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3144
			hwm = min(((pba << 10) * 9 / 10),
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3145
				  ((pba << 10) - adapter->max_frame_size));
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3146
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3147
		fc->high_water = hwm & E1000_FCRTH_RTH; /* 8-byte granularity */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3148
		fc->low_water = fc->high_water - 8;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3149
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3150
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3151
	if (adapter->flags & FLAG_DISABLE_FC_PAUSE_TIME)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3152
		fc->pause_time = 0xFFFF;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3153
	else
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3154
		fc->pause_time = E1000_FC_PAUSE_TIME;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3155
	fc->send_xon = 1;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3156
	fc->current_mode = fc->requested_mode;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3157
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3158
	/* Allow time for pending master requests to run */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3159
	mac->ops.reset_hw(hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3160
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3161
	/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3162
	 * For parts with AMT enabled, let the firmware know
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3163
	 * that the network interface is in control
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3164
	 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3165
	if (adapter->flags & FLAG_HAS_AMT)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3166
		e1000_get_hw_control(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3167
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3168
	ew32(WUC, 0);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3169
	if (adapter->flags2 & FLAG2_HAS_PHY_WAKEUP)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3170
		e1e_wphy(&adapter->hw, BM_WUC, 0);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3171
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3172
	if (mac->ops.init_hw(hw))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3173
		e_err("Hardware Error\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3174
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3175
	e1000_update_mng_vlan(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3176
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3177
	/* Enable h/w to recognize an 802.1Q VLAN Ethernet packet */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3178
	ew32(VET, ETH_P_8021Q);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3179
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3180
	e1000e_reset_adaptive(hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3181
	e1000_get_phy_info(hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3182
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3183
	if ((adapter->flags & FLAG_HAS_SMART_POWER_DOWN) &&
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3184
	    !(adapter->flags & FLAG_SMART_POWER_DOWN)) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3185
		u16 phy_data = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3186
		/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3187
		 * speed up time to link by disabling smart power down, ignore
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3188
		 * the return value of this function because there is nothing
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3189
		 * different we would do if it failed
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3190
		 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3191
		e1e_rphy(hw, IGP02E1000_PHY_POWER_MGMT, &phy_data);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3192
		phy_data &= ~IGP02E1000_PM_SPD;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3193
		e1e_wphy(hw, IGP02E1000_PHY_POWER_MGMT, phy_data);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3194
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3195
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3196
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3197
int e1000e_up(struct e1000_adapter *adapter)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3198
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3199
	struct e1000_hw *hw = &adapter->hw;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3200
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3201
	/* DMA latency requirement to workaround early-receive/jumbo issue */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3202
	if (adapter->flags & FLAG_HAS_ERT)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3203
		adapter->netdev->pm_qos_req =
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3204
			pm_qos_add_request(PM_QOS_CPU_DMA_LATENCY,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3205
				       PM_QOS_DEFAULT_VALUE);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3206
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3207
	/* hardware has been reset, we need to reload some things */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3208
	e1000_configure(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3209
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3210
	clear_bit(__E1000_DOWN, &adapter->state);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3211
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3212
	napi_enable(&adapter->napi);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3213
	if (adapter->msix_entries)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3214
		e1000_configure_msix(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3215
	e1000_irq_enable(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3216
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3217
	netif_wake_queue(adapter->netdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3218
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3219
	/* fire a link change interrupt to start the watchdog */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3220
	if (adapter->msix_entries)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3221
		ew32(ICS, E1000_ICS_LSC | E1000_ICR_OTHER);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3222
	else
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3223
		ew32(ICS, E1000_ICS_LSC);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3224
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3225
	return 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3226
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3227
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3228
void e1000e_down(struct e1000_adapter *adapter)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3229
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3230
	struct net_device *netdev = adapter->netdev;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3231
	struct e1000_hw *hw = &adapter->hw;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3232
	u32 tctl, rctl;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3233
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3234
	/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3235
	 * signal that we're down so the interrupt handler does not
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3236
	 * reschedule our watchdog timer
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3237
	 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3238
	set_bit(__E1000_DOWN, &adapter->state);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3239
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3240
	/* disable receives in the hardware */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3241
	rctl = er32(RCTL);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3242
	ew32(RCTL, rctl & ~E1000_RCTL_EN);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3243
	/* flush and sleep below */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3244
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3245
	netif_stop_queue(netdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3246
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3247
	/* disable transmits in the hardware */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3248
	tctl = er32(TCTL);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3249
	tctl &= ~E1000_TCTL_EN;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3250
	ew32(TCTL, tctl);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3251
	/* flush both disables and wait for them to finish */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3252
	e1e_flush();
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3253
	msleep(10);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3254
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3255
	napi_disable(&adapter->napi);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3256
	e1000_irq_disable(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3257
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3258
	del_timer_sync(&adapter->watchdog_timer);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3259
	del_timer_sync(&adapter->phy_info_timer);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3260
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3261
	netif_carrier_off(netdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3262
	adapter->link_speed = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3263
	adapter->link_duplex = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3264
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3265
	if (!pci_channel_offline(adapter->pdev))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3266
		e1000e_reset(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3267
	e1000_clean_tx_ring(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3268
	e1000_clean_rx_ring(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3269
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3270
	if (adapter->flags & FLAG_HAS_ERT) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3271
		pm_qos_remove_request(
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3272
			      adapter->netdev->pm_qos_req);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3273
		adapter->netdev->pm_qos_req = NULL;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3274
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3275
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3276
	/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3277
	 * TODO: for power management, we could drop the link and
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3278
	 * pci_disable_device here.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3279
	 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3280
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3281
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3282
void e1000e_reinit_locked(struct e1000_adapter *adapter)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3283
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3284
	might_sleep();
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3285
	while (test_and_set_bit(__E1000_RESETTING, &adapter->state))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3286
		msleep(1);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3287
	e1000e_down(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3288
	e1000e_up(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3289
	clear_bit(__E1000_RESETTING, &adapter->state);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3290
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3291
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3292
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3293
 * e1000_sw_init - Initialize general software structures (struct e1000_adapter)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3294
 * @adapter: board private structure to initialize
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3295
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3296
 * e1000_sw_init initializes the Adapter private data structure.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3297
 * Fields are initialized based on PCI device information and
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3298
 * OS network device settings (MTU size).
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3299
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3300
static int __devinit e1000_sw_init(struct e1000_adapter *adapter)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3301
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3302
	struct net_device *netdev = adapter->netdev;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3303
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3304
	adapter->rx_buffer_len = ETH_FRAME_LEN + VLAN_HLEN + ETH_FCS_LEN;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3305
	adapter->rx_ps_bsize0 = 128;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3306
	adapter->max_frame_size = netdev->mtu + ETH_HLEN + ETH_FCS_LEN;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3307
	adapter->min_frame_size = ETH_ZLEN + ETH_FCS_LEN;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3308
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3309
	e1000e_set_interrupt_capability(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3310
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3311
	if (e1000_alloc_queues(adapter))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3312
		return -ENOMEM;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3313
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3314
	/* Explicitly disable IRQ since the NIC can be in any state. */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3315
	e1000_irq_disable(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3316
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3317
	set_bit(__E1000_DOWN, &adapter->state);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3318
	return 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3319
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3320
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3321
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3322
 * e1000_intr_msi_test - Interrupt Handler
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3323
 * @irq: interrupt number
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3324
 * @data: pointer to a network interface device structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3325
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3326
static irqreturn_t e1000_intr_msi_test(int irq, void *data)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3327
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3328
	struct net_device *netdev = data;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3329
	struct e1000_adapter *adapter = netdev_priv(netdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3330
	struct e1000_hw *hw = &adapter->hw;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3331
	u32 icr = er32(ICR);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3332
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3333
	e_dbg("icr is %08X\n", icr);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3334
	if (icr & E1000_ICR_RXSEQ) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3335
		adapter->flags &= ~FLAG_MSI_TEST_FAILED;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3336
		wmb();
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3337
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3338
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3339
	return IRQ_HANDLED;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3340
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3341
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3342
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3343
 * e1000_test_msi_interrupt - Returns 0 for successful test
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3344
 * @adapter: board private struct
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3345
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3346
 * code flow taken from tg3.c
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3347
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3348
static int e1000_test_msi_interrupt(struct e1000_adapter *adapter)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3349
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3350
	struct net_device *netdev = adapter->netdev;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3351
	struct e1000_hw *hw = &adapter->hw;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3352
	int err;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3353
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3354
	/* poll_enable hasn't been called yet, so don't need disable */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3355
	/* clear any pending events */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3356
	er32(ICR);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3357
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3358
	/* free the real vector and request a test handler */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3359
	e1000_free_irq(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3360
	e1000e_reset_interrupt_capability(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3361
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3362
	/* Assume that the test fails, if it succeeds then the test
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3363
	 * MSI irq handler will unset this flag */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3364
	adapter->flags |= FLAG_MSI_TEST_FAILED;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3365
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3366
	err = pci_enable_msi(adapter->pdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3367
	if (err)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3368
		goto msi_test_failed;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3369
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3370
	err = request_irq(adapter->pdev->irq, e1000_intr_msi_test, 0,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3371
			  netdev->name, netdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3372
	if (err) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3373
		pci_disable_msi(adapter->pdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3374
		goto msi_test_failed;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3375
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3376
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3377
	wmb();
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3378
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3379
	e1000_irq_enable(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3380
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3381
	/* fire an unusual interrupt on the test handler */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3382
	ew32(ICS, E1000_ICS_RXSEQ);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3383
	e1e_flush();
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3384
	msleep(50);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3385
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3386
	e1000_irq_disable(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3387
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3388
	rmb();
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3389
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3390
	if (adapter->flags & FLAG_MSI_TEST_FAILED) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3391
		adapter->int_mode = E1000E_INT_MODE_LEGACY;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3392
		err = -EIO;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3393
		e_info("MSI interrupt test failed!\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3394
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3395
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3396
	free_irq(adapter->pdev->irq, netdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3397
	pci_disable_msi(adapter->pdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3398
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3399
	if (err == -EIO)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3400
		goto msi_test_failed;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3401
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3402
	/* okay so the test worked, restore settings */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3403
	e_dbg("MSI interrupt test succeeded!\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3404
msi_test_failed:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3405
	e1000e_set_interrupt_capability(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3406
	e1000_request_irq(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3407
	return err;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3408
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3409
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3410
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3411
 * e1000_test_msi - Returns 0 if MSI test succeeds or INTx mode is restored
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3412
 * @adapter: board private struct
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3413
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3414
 * code flow taken from tg3.c, called with e1000 interrupts disabled.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3415
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3416
static int e1000_test_msi(struct e1000_adapter *adapter)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3417
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3418
	int err;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3419
	u16 pci_cmd;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3420
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3421
	if (!(adapter->flags & FLAG_MSI_ENABLED))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3422
		return 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3423
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3424
	/* disable SERR in case the MSI write causes a master abort */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3425
	pci_read_config_word(adapter->pdev, PCI_COMMAND, &pci_cmd);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3426
	if (pci_cmd & PCI_COMMAND_SERR)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3427
		pci_write_config_word(adapter->pdev, PCI_COMMAND,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3428
				      pci_cmd & ~PCI_COMMAND_SERR);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3429
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3430
	err = e1000_test_msi_interrupt(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3431
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3432
	/* re-enable SERR */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3433
	if (pci_cmd & PCI_COMMAND_SERR) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3434
		pci_read_config_word(adapter->pdev, PCI_COMMAND, &pci_cmd);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3435
		pci_cmd |= PCI_COMMAND_SERR;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3436
		pci_write_config_word(adapter->pdev, PCI_COMMAND, pci_cmd);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3437
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3438
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3439
	/* success ! */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3440
	if (!err)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3441
		return 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3442
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3443
	/* EIO means MSI test failed */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3444
	if (err != -EIO)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3445
		return err;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3446
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3447
	/* back to INTx mode */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3448
	e_warn("MSI interrupt test failed, using legacy interrupt.\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3449
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3450
	e1000_free_irq(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3451
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3452
	err = e1000_request_irq(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3453
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3454
	return err;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3455
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3456
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3457
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3458
 * e1000_open - Called when a network interface is made active
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3459
 * @netdev: network interface device structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3460
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3461
 * Returns 0 on success, negative value on failure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3462
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3463
 * The open entry point is called when a network interface is made
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3464
 * active by the system (IFF_UP).  At this point all resources needed
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3465
 * for transmit and receive operations are allocated, the interrupt
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3466
 * handler is registered with the OS, the watchdog timer is started,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3467
 * and the stack is notified that the interface is ready.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3468
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3469
static int e1000_open(struct net_device *netdev)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3470
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3471
	struct e1000_adapter *adapter = netdev_priv(netdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3472
	struct e1000_hw *hw = &adapter->hw;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3473
	struct pci_dev *pdev = adapter->pdev;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3474
	int err;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3475
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3476
	/* disallow open during test */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3477
	if (test_bit(__E1000_TESTING, &adapter->state))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3478
		return -EBUSY;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3479
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3480
	pm_runtime_get_sync(&pdev->dev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3481
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3482
	netif_carrier_off(netdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3483
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3484
	/* allocate transmit descriptors */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3485
	err = e1000e_setup_tx_resources(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3486
	if (err)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3487
		goto err_setup_tx;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3488
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3489
	/* allocate receive descriptors */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3490
	err = e1000e_setup_rx_resources(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3491
	if (err)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3492
		goto err_setup_rx;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3493
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3494
	/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3495
	 * If AMT is enabled, let the firmware know that the network
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3496
	 * interface is now open and reset the part to a known state.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3497
	 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3498
	if (adapter->flags & FLAG_HAS_AMT) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3499
		e1000_get_hw_control(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3500
		e1000e_reset(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3501
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3502
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3503
	e1000e_power_up_phy(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3504
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3505
	adapter->mng_vlan_id = E1000_MNG_VLAN_NONE;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3506
	if ((adapter->hw.mng_cookie.status &
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3507
	     E1000_MNG_DHCP_COOKIE_STATUS_VLAN))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3508
		e1000_update_mng_vlan(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3509
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3510
	/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3511
	 * before we allocate an interrupt, we must be ready to handle it.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3512
	 * Setting DEBUG_SHIRQ in the kernel makes it fire an interrupt
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3513
	 * as soon as we call pci_request_irq, so we have to setup our
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3514
	 * clean_rx handler before we do so.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3515
	 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3516
	e1000_configure(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3517
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3518
	err = e1000_request_irq(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3519
	if (err)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3520
		goto err_req_irq;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3521
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3522
	/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3523
	 * Work around PCIe errata with MSI interrupts causing some chipsets to
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3524
	 * ignore e1000e MSI messages, which means we need to test our MSI
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3525
	 * interrupt now
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3526
	 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3527
	if (adapter->int_mode != E1000E_INT_MODE_LEGACY) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3528
		err = e1000_test_msi(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3529
		if (err) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3530
			e_err("Interrupt allocation failed\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3531
			goto err_req_irq;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3532
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3533
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3534
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3535
	/* From here on the code is the same as e1000e_up() */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3536
	clear_bit(__E1000_DOWN, &adapter->state);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3537
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3538
	napi_enable(&adapter->napi);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3539
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3540
	e1000_irq_enable(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3541
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3542
	netif_start_queue(netdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3543
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3544
	adapter->idle_check = true;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3545
	pm_runtime_put(&pdev->dev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3546
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3547
	/* fire a link status change interrupt to start the watchdog */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3548
	if (adapter->msix_entries)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3549
		ew32(ICS, E1000_ICS_LSC | E1000_ICR_OTHER);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3550
	else
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3551
		ew32(ICS, E1000_ICS_LSC);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3552
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3553
	return 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3554
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3555
err_req_irq:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3556
	e1000_release_hw_control(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3557
	e1000_power_down_phy(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3558
	e1000e_free_rx_resources(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3559
err_setup_rx:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3560
	e1000e_free_tx_resources(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3561
err_setup_tx:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3562
	e1000e_reset(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3563
	pm_runtime_put_sync(&pdev->dev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3564
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3565
	return err;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3566
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3567
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3568
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3569
 * e1000_close - Disables a network interface
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3570
 * @netdev: network interface device structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3571
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3572
 * Returns 0, this is not allowed to fail
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3573
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3574
 * The close entry point is called when an interface is de-activated
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3575
 * by the OS.  The hardware is still under the drivers control, but
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3576
 * needs to be disabled.  A global MAC reset is issued to stop the
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3577
 * hardware, and all transmit and receive resources are freed.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3578
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3579
static int e1000_close(struct net_device *netdev)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3580
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3581
	struct e1000_adapter *adapter = netdev_priv(netdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3582
	struct pci_dev *pdev = adapter->pdev;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3583
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3584
	WARN_ON(test_bit(__E1000_RESETTING, &adapter->state));
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3585
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3586
	pm_runtime_get_sync(&pdev->dev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3587
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3588
	if (!test_bit(__E1000_DOWN, &adapter->state)) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3589
		e1000e_down(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3590
		e1000_free_irq(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3591
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3592
	e1000_power_down_phy(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3593
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3594
	e1000e_free_tx_resources(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3595
	e1000e_free_rx_resources(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3596
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3597
	/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3598
	 * kill manageability vlan ID if supported, but not if a vlan with
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3599
	 * the same ID is registered on the host OS (let 8021q kill it)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3600
	 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3601
	if ((adapter->hw.mng_cookie.status &
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3602
			  E1000_MNG_DHCP_COOKIE_STATUS_VLAN) &&
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3603
	     !(adapter->vlgrp &&
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3604
	       vlan_group_get_device(adapter->vlgrp, adapter->mng_vlan_id)))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3605
		e1000_vlan_rx_kill_vid(netdev, adapter->mng_vlan_id);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3606
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3607
	/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3608
	 * If AMT is enabled, let the firmware know that the network
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3609
	 * interface is now closed
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3610
	 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3611
	if (adapter->flags & FLAG_HAS_AMT)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3612
		e1000_release_hw_control(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3613
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3614
	pm_runtime_put_sync(&pdev->dev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3615
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3616
	return 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3617
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3618
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3619
 * e1000_set_mac - Change the Ethernet Address of the NIC
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3620
 * @netdev: network interface device structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3621
 * @p: pointer to an address structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3622
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3623
 * Returns 0 on success, negative on failure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3624
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3625
static int e1000_set_mac(struct net_device *netdev, void *p)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3626
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3627
	struct e1000_adapter *adapter = netdev_priv(netdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3628
	struct sockaddr *addr = p;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3629
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3630
	if (!is_valid_ether_addr(addr->sa_data))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3631
		return -EADDRNOTAVAIL;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3632
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3633
	memcpy(netdev->dev_addr, addr->sa_data, netdev->addr_len);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3634
	memcpy(adapter->hw.mac.addr, addr->sa_data, netdev->addr_len);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3635
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3636
	e1000e_rar_set(&adapter->hw, adapter->hw.mac.addr, 0);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3637
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3638
	if (adapter->flags & FLAG_RESET_OVERWRITES_LAA) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3639
		/* activate the work around */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3640
		e1000e_set_laa_state_82571(&adapter->hw, 1);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3641
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3642
		/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3643
		 * Hold a copy of the LAA in RAR[14] This is done so that
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3644
		 * between the time RAR[0] gets clobbered  and the time it
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3645
		 * gets fixed (in e1000_watchdog), the actual LAA is in one
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3646
		 * of the RARs and no incoming packets directed to this port
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3647
		 * are dropped. Eventually the LAA will be in RAR[0] and
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3648
		 * RAR[14]
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3649
		 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3650
		e1000e_rar_set(&adapter->hw,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3651
			      adapter->hw.mac.addr,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3652
			      adapter->hw.mac.rar_entry_count - 1);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3653
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3654
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3655
	return 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3656
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3657
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3658
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3659
 * e1000e_update_phy_task - work thread to update phy
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3660
 * @work: pointer to our work struct
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3661
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3662
 * this worker thread exists because we must acquire a
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3663
 * semaphore to read the phy, which we could msleep while
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3664
 * waiting for it, and we can't msleep in a timer.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3665
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3666
static void e1000e_update_phy_task(struct work_struct *work)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3667
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3668
	struct e1000_adapter *adapter = container_of(work,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3669
					struct e1000_adapter, update_phy_task);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3670
	e1000_get_phy_info(&adapter->hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3671
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3672
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3673
/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3674
 * Need to wait a few seconds after link up to get diagnostic information from
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3675
 * the phy
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3676
 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3677
static void e1000_update_phy_info(unsigned long data)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3678
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3679
	struct e1000_adapter *adapter = (struct e1000_adapter *) data;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3680
	schedule_work(&adapter->update_phy_task);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3681
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3682
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3683
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3684
 * e1000e_update_stats - Update the board statistics counters
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3685
 * @adapter: board private structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3686
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3687
void e1000e_update_stats(struct e1000_adapter *adapter)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3688
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3689
	struct net_device *netdev = adapter->netdev;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3690
	struct e1000_hw *hw = &adapter->hw;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3691
	struct pci_dev *pdev = adapter->pdev;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3692
	u16 phy_data;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3693
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3694
	/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3695
	 * Prevent stats update while adapter is being reset, or if the pci
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3696
	 * connection is down.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3697
	 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3698
	if (adapter->link_speed == 0)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3699
		return;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3700
	if (pci_channel_offline(pdev))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3701
		return;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3702
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3703
	adapter->stats.crcerrs += er32(CRCERRS);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3704
	adapter->stats.gprc += er32(GPRC);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3705
	adapter->stats.gorc += er32(GORCL);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3706
	er32(GORCH); /* Clear gorc */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3707
	adapter->stats.bprc += er32(BPRC);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3708
	adapter->stats.mprc += er32(MPRC);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3709
	adapter->stats.roc += er32(ROC);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3710
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3711
	adapter->stats.mpc += er32(MPC);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3712
	if ((hw->phy.type == e1000_phy_82578) ||
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3713
	    (hw->phy.type == e1000_phy_82577)) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3714
		e1e_rphy(hw, HV_SCC_UPPER, &phy_data);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3715
		if (!e1e_rphy(hw, HV_SCC_LOWER, &phy_data))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3716
			adapter->stats.scc += phy_data;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3717
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3718
		e1e_rphy(hw, HV_ECOL_UPPER, &phy_data);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3719
		if (!e1e_rphy(hw, HV_ECOL_LOWER, &phy_data))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3720
			adapter->stats.ecol += phy_data;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3721
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3722
		e1e_rphy(hw, HV_MCC_UPPER, &phy_data);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3723
		if (!e1e_rphy(hw, HV_MCC_LOWER, &phy_data))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3724
			adapter->stats.mcc += phy_data;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3725
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3726
		e1e_rphy(hw, HV_LATECOL_UPPER, &phy_data);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3727
		if (!e1e_rphy(hw, HV_LATECOL_LOWER, &phy_data))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3728
			adapter->stats.latecol += phy_data;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3729
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3730
		e1e_rphy(hw, HV_DC_UPPER, &phy_data);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3731
		if (!e1e_rphy(hw, HV_DC_LOWER, &phy_data))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3732
			adapter->stats.dc += phy_data;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3733
	} else {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3734
		adapter->stats.scc += er32(SCC);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3735
		adapter->stats.ecol += er32(ECOL);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3736
		adapter->stats.mcc += er32(MCC);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3737
		adapter->stats.latecol += er32(LATECOL);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3738
		adapter->stats.dc += er32(DC);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3739
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3740
	adapter->stats.xonrxc += er32(XONRXC);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3741
	adapter->stats.xontxc += er32(XONTXC);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3742
	adapter->stats.xoffrxc += er32(XOFFRXC);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3743
	adapter->stats.xofftxc += er32(XOFFTXC);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3744
	adapter->stats.gptc += er32(GPTC);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3745
	adapter->stats.gotc += er32(GOTCL);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3746
	er32(GOTCH); /* Clear gotc */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3747
	adapter->stats.rnbc += er32(RNBC);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3748
	adapter->stats.ruc += er32(RUC);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3749
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3750
	adapter->stats.mptc += er32(MPTC);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3751
	adapter->stats.bptc += er32(BPTC);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3752
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3753
	/* used for adaptive IFS */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3754
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3755
	hw->mac.tx_packet_delta = er32(TPT);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3756
	adapter->stats.tpt += hw->mac.tx_packet_delta;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3757
	if ((hw->phy.type == e1000_phy_82578) ||
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3758
	    (hw->phy.type == e1000_phy_82577)) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3759
		e1e_rphy(hw, HV_COLC_UPPER, &phy_data);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3760
		if (!e1e_rphy(hw, HV_COLC_LOWER, &phy_data))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3761
			hw->mac.collision_delta = phy_data;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3762
	} else {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3763
		hw->mac.collision_delta = er32(COLC);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3764
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3765
	adapter->stats.colc += hw->mac.collision_delta;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3766
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3767
	adapter->stats.algnerrc += er32(ALGNERRC);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3768
	adapter->stats.rxerrc += er32(RXERRC);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3769
	if ((hw->phy.type == e1000_phy_82578) ||
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3770
	    (hw->phy.type == e1000_phy_82577)) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3771
		e1e_rphy(hw, HV_TNCRS_UPPER, &phy_data);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3772
		if (!e1e_rphy(hw, HV_TNCRS_LOWER, &phy_data))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3773
			adapter->stats.tncrs += phy_data;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3774
	} else {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3775
		if ((hw->mac.type != e1000_82574) &&
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3776
		    (hw->mac.type != e1000_82583))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3777
			adapter->stats.tncrs += er32(TNCRS);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3778
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3779
	adapter->stats.cexterr += er32(CEXTERR);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3780
	adapter->stats.tsctc += er32(TSCTC);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3781
	adapter->stats.tsctfc += er32(TSCTFC);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3782
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3783
	/* Fill out the OS statistics structure */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3784
	netdev->stats.multicast = adapter->stats.mprc;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3785
	netdev->stats.collisions = adapter->stats.colc;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3786
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3787
	/* Rx Errors */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3788
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3789
	/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3790
	 * RLEC on some newer hardware can be incorrect so build
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3791
	 * our own version based on RUC and ROC
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3792
	 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3793
	netdev->stats.rx_errors = adapter->stats.rxerrc +
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3794
		adapter->stats.crcerrs + adapter->stats.algnerrc +
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3795
		adapter->stats.ruc + adapter->stats.roc +
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3796
		adapter->stats.cexterr;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3797
	netdev->stats.rx_length_errors = adapter->stats.ruc +
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3798
					      adapter->stats.roc;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3799
	netdev->stats.rx_crc_errors = adapter->stats.crcerrs;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3800
	netdev->stats.rx_frame_errors = adapter->stats.algnerrc;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3801
	netdev->stats.rx_missed_errors = adapter->stats.mpc;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3802
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3803
	/* Tx Errors */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3804
	netdev->stats.tx_errors = adapter->stats.ecol +
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3805
				       adapter->stats.latecol;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3806
	netdev->stats.tx_aborted_errors = adapter->stats.ecol;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3807
	netdev->stats.tx_window_errors = adapter->stats.latecol;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3808
	netdev->stats.tx_carrier_errors = adapter->stats.tncrs;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3809
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3810
	/* Tx Dropped needs to be maintained elsewhere */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3811
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3812
	/* Management Stats */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3813
	adapter->stats.mgptc += er32(MGTPTC);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3814
	adapter->stats.mgprc += er32(MGTPRC);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3815
	adapter->stats.mgpdc += er32(MGTPDC);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3816
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3817
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3818
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3819
 * e1000_phy_read_status - Update the PHY register status snapshot
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3820
 * @adapter: board private structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3821
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3822
static void e1000_phy_read_status(struct e1000_adapter *adapter)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3823
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3824
	struct e1000_hw *hw = &adapter->hw;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3825
	struct e1000_phy_regs *phy = &adapter->phy_regs;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3826
	int ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3827
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3828
	if ((er32(STATUS) & E1000_STATUS_LU) &&
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3829
	    (adapter->hw.phy.media_type == e1000_media_type_copper)) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3830
		ret_val  = e1e_rphy(hw, PHY_CONTROL, &phy->bmcr);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3831
		ret_val |= e1e_rphy(hw, PHY_STATUS, &phy->bmsr);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3832
		ret_val |= e1e_rphy(hw, PHY_AUTONEG_ADV, &phy->advertise);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3833
		ret_val |= e1e_rphy(hw, PHY_LP_ABILITY, &phy->lpa);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3834
		ret_val |= e1e_rphy(hw, PHY_AUTONEG_EXP, &phy->expansion);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3835
		ret_val |= e1e_rphy(hw, PHY_1000T_CTRL, &phy->ctrl1000);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3836
		ret_val |= e1e_rphy(hw, PHY_1000T_STATUS, &phy->stat1000);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3837
		ret_val |= e1e_rphy(hw, PHY_EXT_STATUS, &phy->estatus);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3838
		if (ret_val)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3839
			e_warn("Error reading PHY register\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3840
	} else {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3841
		/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3842
		 * Do not read PHY registers if link is not up
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3843
		 * Set values to typical power-on defaults
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3844
		 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3845
		phy->bmcr = (BMCR_SPEED1000 | BMCR_ANENABLE | BMCR_FULLDPLX);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3846
		phy->bmsr = (BMSR_100FULL | BMSR_100HALF | BMSR_10FULL |
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3847
			     BMSR_10HALF | BMSR_ESTATEN | BMSR_ANEGCAPABLE |
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3848
			     BMSR_ERCAP);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3849
		phy->advertise = (ADVERTISE_PAUSE_ASYM | ADVERTISE_PAUSE_CAP |
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3850
				  ADVERTISE_ALL | ADVERTISE_CSMA);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3851
		phy->lpa = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3852
		phy->expansion = EXPANSION_ENABLENPAGE;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3853
		phy->ctrl1000 = ADVERTISE_1000FULL;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3854
		phy->stat1000 = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3855
		phy->estatus = (ESTATUS_1000_TFULL | ESTATUS_1000_THALF);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3856
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3857
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3858
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3859
static void e1000_print_link_info(struct e1000_adapter *adapter)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3860
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3861
	struct e1000_hw *hw = &adapter->hw;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3862
	u32 ctrl = er32(CTRL);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3863
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3864
	/* Link status message must follow this format for user tools */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3865
	printk(KERN_INFO "e1000e: %s NIC Link is Up %d Mbps %s, "
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3866
	       "Flow Control: %s\n",
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3867
	       adapter->netdev->name,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3868
	       adapter->link_speed,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3869
	       (adapter->link_duplex == FULL_DUPLEX) ?
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3870
	                        "Full Duplex" : "Half Duplex",
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3871
	       ((ctrl & E1000_CTRL_TFCE) && (ctrl & E1000_CTRL_RFCE)) ?
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3872
	                        "RX/TX" :
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3873
	       ((ctrl & E1000_CTRL_RFCE) ? "RX" :
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3874
	       ((ctrl & E1000_CTRL_TFCE) ? "TX" : "None" )));
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3875
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3876
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3877
bool e1000e_has_link(struct e1000_adapter *adapter)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3878
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3879
	struct e1000_hw *hw = &adapter->hw;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3880
	bool link_active = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3881
	s32 ret_val = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3882
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3883
	/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3884
	 * get_link_status is set on LSC (link status) interrupt or
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3885
	 * Rx sequence error interrupt.  get_link_status will stay
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3886
	 * false until the check_for_link establishes link
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3887
	 * for copper adapters ONLY
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3888
	 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3889
	switch (hw->phy.media_type) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3890
	case e1000_media_type_copper:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3891
		if (hw->mac.get_link_status) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3892
			ret_val = hw->mac.ops.check_for_link(hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3893
			link_active = !hw->mac.get_link_status;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3894
		} else {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3895
			link_active = 1;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3896
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3897
		break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3898
	case e1000_media_type_fiber:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3899
		ret_val = hw->mac.ops.check_for_link(hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3900
		link_active = !!(er32(STATUS) & E1000_STATUS_LU);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3901
		break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3902
	case e1000_media_type_internal_serdes:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3903
		ret_val = hw->mac.ops.check_for_link(hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3904
		link_active = adapter->hw.mac.serdes_has_link;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3905
		break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3906
	default:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3907
	case e1000_media_type_unknown:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3908
		break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3909
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3910
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3911
	if ((ret_val == E1000_ERR_PHY) && (hw->phy.type == e1000_phy_igp_3) &&
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3912
	    (er32(CTRL) & E1000_PHY_CTRL_GBE_DISABLE)) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3913
		/* See e1000_kmrn_lock_loss_workaround_ich8lan() */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3914
		e_info("Gigabit has been disabled, downgrading speed\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3915
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3916
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3917
	return link_active;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3918
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3919
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3920
static void e1000e_enable_receives(struct e1000_adapter *adapter)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3921
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3922
	/* make sure the receive unit is started */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3923
	if ((adapter->flags & FLAG_RX_NEEDS_RESTART) &&
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3924
	    (adapter->flags & FLAG_RX_RESTART_NOW)) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3925
		struct e1000_hw *hw = &adapter->hw;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3926
		u32 rctl = er32(RCTL);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3927
		ew32(RCTL, rctl | E1000_RCTL_EN);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3928
		adapter->flags &= ~FLAG_RX_RESTART_NOW;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3929
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3930
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3931
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3932
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3933
 * e1000_watchdog - Timer Call-back
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3934
 * @data: pointer to adapter cast into an unsigned long
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3935
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3936
static void e1000_watchdog(unsigned long data)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3937
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3938
	struct e1000_adapter *adapter = (struct e1000_adapter *) data;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3939
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3940
	/* Do the rest outside of interrupt context */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3941
	schedule_work(&adapter->watchdog_task);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3942
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3943
	/* TODO: make this use queue_delayed_work() */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3944
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3945
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3946
static void e1000_watchdog_task(struct work_struct *work)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3947
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3948
	struct e1000_adapter *adapter = container_of(work,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3949
					struct e1000_adapter, watchdog_task);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3950
	struct net_device *netdev = adapter->netdev;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3951
	struct e1000_mac_info *mac = &adapter->hw.mac;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3952
	struct e1000_phy_info *phy = &adapter->hw.phy;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3953
	struct e1000_ring *tx_ring = adapter->tx_ring;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3954
	struct e1000_hw *hw = &adapter->hw;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3955
	u32 link, tctl;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3956
	int tx_pending = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3957
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3958
	link = e1000e_has_link(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3959
	if ((netif_carrier_ok(netdev)) && link) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3960
		/* Cancel scheduled suspend requests. */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3961
		pm_runtime_resume(netdev->dev.parent);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3962
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3963
		e1000e_enable_receives(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3964
		goto link_up;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3965
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3966
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3967
	if ((e1000e_enable_tx_pkt_filtering(hw)) &&
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3968
	    (adapter->mng_vlan_id != adapter->hw.mng_cookie.vlan_id))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3969
		e1000_update_mng_vlan(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3970
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3971
	if (link) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3972
		if (!netif_carrier_ok(netdev)) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3973
			bool txb2b = 1;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3974
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3975
			/* Cancel scheduled suspend requests. */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3976
			pm_runtime_resume(netdev->dev.parent);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3977
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3978
			/* update snapshot of PHY registers on LSC */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3979
			e1000_phy_read_status(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3980
			mac->ops.get_link_up_info(&adapter->hw,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3981
						   &adapter->link_speed,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3982
						   &adapter->link_duplex);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3983
			e1000_print_link_info(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3984
			/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3985
			 * On supported PHYs, check for duplex mismatch only
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3986
			 * if link has autonegotiated at 10/100 half
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3987
			 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3988
			if ((hw->phy.type == e1000_phy_igp_3 ||
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3989
			     hw->phy.type == e1000_phy_bm) &&
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3990
			    (hw->mac.autoneg == true) &&
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3991
			    (adapter->link_speed == SPEED_10 ||
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3992
			     adapter->link_speed == SPEED_100) &&
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3993
			    (adapter->link_duplex == HALF_DUPLEX)) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3994
				u16 autoneg_exp;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3995
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3996
				e1e_rphy(hw, PHY_AUTONEG_EXP, &autoneg_exp);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3997
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3998
				if (!(autoneg_exp & NWAY_ER_LP_NWAY_CAPS))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3999
					e_info("Autonegotiated half duplex but"
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4000
					       " link partner cannot autoneg. "
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4001
					       " Try forcing full duplex if "
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4002
					       "link gets many collisions.\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4003
			}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4004
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4005
			/* adjust timeout factor according to speed/duplex */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4006
			adapter->tx_timeout_factor = 1;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4007
			switch (adapter->link_speed) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4008
			case SPEED_10:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4009
				txb2b = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4010
				adapter->tx_timeout_factor = 16;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4011
				break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4012
			case SPEED_100:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4013
				txb2b = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4014
				adapter->tx_timeout_factor = 10;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4015
				break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4016
			}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4017
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4018
			/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4019
			 * workaround: re-program speed mode bit after
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4020
			 * link-up event
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4021
			 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4022
			if ((adapter->flags & FLAG_TARC_SPEED_MODE_BIT) &&
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4023
			    !txb2b) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4024
				u32 tarc0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4025
				tarc0 = er32(TARC(0));
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4026
				tarc0 &= ~SPEED_MODE_BIT;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4027
				ew32(TARC(0), tarc0);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4028
			}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4029
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4030
			/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4031
			 * disable TSO for pcie and 10/100 speeds, to avoid
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4032
			 * some hardware issues
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4033
			 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4034
			if (!(adapter->flags & FLAG_TSO_FORCE)) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4035
				switch (adapter->link_speed) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4036
				case SPEED_10:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4037
				case SPEED_100:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4038
					e_info("10/100 speed: disabling TSO\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4039
					netdev->features &= ~NETIF_F_TSO;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4040
					netdev->features &= ~NETIF_F_TSO6;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4041
					break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4042
				case SPEED_1000:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4043
					netdev->features |= NETIF_F_TSO;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4044
					netdev->features |= NETIF_F_TSO6;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4045
					break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4046
				default:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4047
					/* oops */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4048
					break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4049
				}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4050
			}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4051
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4052
			/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4053
			 * enable transmits in the hardware, need to do this
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4054
			 * after setting TARC(0)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4055
			 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4056
			tctl = er32(TCTL);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4057
			tctl |= E1000_TCTL_EN;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4058
			ew32(TCTL, tctl);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4059
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4060
                        /*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4061
			 * Perform any post-link-up configuration before
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4062
			 * reporting link up.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4063
			 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4064
			if (phy->ops.cfg_on_link_up)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4065
				phy->ops.cfg_on_link_up(hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4066
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4067
			netif_carrier_on(netdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4068
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4069
			if (!test_bit(__E1000_DOWN, &adapter->state))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4070
				mod_timer(&adapter->phy_info_timer,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4071
					  round_jiffies(jiffies + 2 * HZ));
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4072
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4073
	} else {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4074
		if (netif_carrier_ok(netdev)) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4075
			adapter->link_speed = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4076
			adapter->link_duplex = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4077
			/* Link status message must follow this format */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4078
			printk(KERN_INFO "e1000e: %s NIC Link is Down\n",
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4079
			       adapter->netdev->name);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4080
			netif_carrier_off(netdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4081
			if (!test_bit(__E1000_DOWN, &adapter->state))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4082
				mod_timer(&adapter->phy_info_timer,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4083
					  round_jiffies(jiffies + 2 * HZ));
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4084
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4085
			if (adapter->flags & FLAG_RX_NEEDS_RESTART)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4086
				schedule_work(&adapter->reset_task);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4087
			else
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4088
				pm_schedule_suspend(netdev->dev.parent,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4089
							LINK_TIMEOUT);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4090
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4091
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4092
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4093
link_up:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4094
	e1000e_update_stats(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4095
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4096
	mac->tx_packet_delta = adapter->stats.tpt - adapter->tpt_old;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4097
	adapter->tpt_old = adapter->stats.tpt;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4098
	mac->collision_delta = adapter->stats.colc - adapter->colc_old;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4099
	adapter->colc_old = adapter->stats.colc;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4100
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4101
	adapter->gorc = adapter->stats.gorc - adapter->gorc_old;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4102
	adapter->gorc_old = adapter->stats.gorc;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4103
	adapter->gotc = adapter->stats.gotc - adapter->gotc_old;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4104
	adapter->gotc_old = adapter->stats.gotc;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4105
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4106
	e1000e_update_adaptive(&adapter->hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4107
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4108
	if (!netif_carrier_ok(netdev)) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4109
		tx_pending = (e1000_desc_unused(tx_ring) + 1 <
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4110
			       tx_ring->count);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4111
		if (tx_pending) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4112
			/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4113
			 * We've lost link, so the controller stops DMA,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4114
			 * but we've got queued Tx work that's never going
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4115
			 * to get done, so reset controller to flush Tx.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4116
			 * (Do the reset outside of interrupt context).
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4117
			 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4118
			adapter->tx_timeout_count++;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4119
			schedule_work(&adapter->reset_task);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4120
			/* return immediately since reset is imminent */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4121
			return;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4122
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4123
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4124
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4125
	/* Simple mode for Interrupt Throttle Rate (ITR) */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4126
	if (adapter->itr_setting == 4) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4127
		/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4128
		 * Symmetric Tx/Rx gets a reduced ITR=2000;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4129
		 * Total asymmetrical Tx or Rx gets ITR=8000;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4130
		 * everyone else is between 2000-8000.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4131
		 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4132
		u32 goc = (adapter->gotc + adapter->gorc) / 10000;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4133
		u32 dif = (adapter->gotc > adapter->gorc ?
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4134
			    adapter->gotc - adapter->gorc :
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4135
			    adapter->gorc - adapter->gotc) / 10000;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4136
		u32 itr = goc > 0 ? (dif * 6000 / goc + 2000) : 8000;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4137
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4138
		ew32(ITR, 1000000000 / (itr * 256));
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4139
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4140
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4141
	/* Cause software interrupt to ensure Rx ring is cleaned */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4142
	if (adapter->msix_entries)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4143
		ew32(ICS, adapter->rx_ring->ims_val);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4144
	else
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4145
		ew32(ICS, E1000_ICS_RXDMT0);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4146
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4147
	/* Force detection of hung controller every watchdog period */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4148
	adapter->detect_tx_hung = 1;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4149
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4150
	/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4151
	 * With 82571 controllers, LAA may be overwritten due to controller
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4152
	 * reset from the other port. Set the appropriate LAA in RAR[0]
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4153
	 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4154
	if (e1000e_get_laa_state_82571(hw))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4155
		e1000e_rar_set(hw, adapter->hw.mac.addr, 0);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4156
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4157
	/* Reset the timer */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4158
	if (!test_bit(__E1000_DOWN, &adapter->state))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4159
		mod_timer(&adapter->watchdog_timer,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4160
			  round_jiffies(jiffies + 2 * HZ));
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4161
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4162
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4163
#define E1000_TX_FLAGS_CSUM		0x00000001
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4164
#define E1000_TX_FLAGS_VLAN		0x00000002
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4165
#define E1000_TX_FLAGS_TSO		0x00000004
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4166
#define E1000_TX_FLAGS_IPV4		0x00000008
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4167
#define E1000_TX_FLAGS_VLAN_MASK	0xffff0000
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4168
#define E1000_TX_FLAGS_VLAN_SHIFT	16
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4169
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4170
static int e1000_tso(struct e1000_adapter *adapter,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4171
		     struct sk_buff *skb)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4172
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4173
	struct e1000_ring *tx_ring = adapter->tx_ring;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4174
	struct e1000_context_desc *context_desc;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4175
	struct e1000_buffer *buffer_info;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4176
	unsigned int i;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4177
	u32 cmd_length = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4178
	u16 ipcse = 0, tucse, mss;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4179
	u8 ipcss, ipcso, tucss, tucso, hdr_len;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4180
	int err;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4181
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4182
	if (!skb_is_gso(skb))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4183
		return 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4184
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4185
	if (skb_header_cloned(skb)) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4186
		err = pskb_expand_head(skb, 0, 0, GFP_ATOMIC);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4187
		if (err)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4188
			return err;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4189
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4190
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4191
	hdr_len = skb_transport_offset(skb) + tcp_hdrlen(skb);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4192
	mss = skb_shinfo(skb)->gso_size;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4193
	if (skb->protocol == htons(ETH_P_IP)) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4194
		struct iphdr *iph = ip_hdr(skb);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4195
		iph->tot_len = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4196
		iph->check = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4197
		tcp_hdr(skb)->check = ~csum_tcpudp_magic(iph->saddr, iph->daddr,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4198
		                                         0, IPPROTO_TCP, 0);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4199
		cmd_length = E1000_TXD_CMD_IP;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4200
		ipcse = skb_transport_offset(skb) - 1;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4201
	} else if (skb_is_gso_v6(skb)) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4202
		ipv6_hdr(skb)->payload_len = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4203
		tcp_hdr(skb)->check = ~csum_ipv6_magic(&ipv6_hdr(skb)->saddr,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4204
		                                       &ipv6_hdr(skb)->daddr,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4205
		                                       0, IPPROTO_TCP, 0);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4206
		ipcse = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4207
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4208
	ipcss = skb_network_offset(skb);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4209
	ipcso = (void *)&(ip_hdr(skb)->check) - (void *)skb->data;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4210
	tucss = skb_transport_offset(skb);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4211
	tucso = (void *)&(tcp_hdr(skb)->check) - (void *)skb->data;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4212
	tucse = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4213
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4214
	cmd_length |= (E1000_TXD_CMD_DEXT | E1000_TXD_CMD_TSE |
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4215
	               E1000_TXD_CMD_TCP | (skb->len - (hdr_len)));
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4216
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4217
	i = tx_ring->next_to_use;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4218
	context_desc = E1000_CONTEXT_DESC(*tx_ring, i);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4219
	buffer_info = &tx_ring->buffer_info[i];
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4220
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4221
	context_desc->lower_setup.ip_fields.ipcss  = ipcss;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4222
	context_desc->lower_setup.ip_fields.ipcso  = ipcso;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4223
	context_desc->lower_setup.ip_fields.ipcse  = cpu_to_le16(ipcse);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4224
	context_desc->upper_setup.tcp_fields.tucss = tucss;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4225
	context_desc->upper_setup.tcp_fields.tucso = tucso;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4226
	context_desc->upper_setup.tcp_fields.tucse = cpu_to_le16(tucse);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4227
	context_desc->tcp_seg_setup.fields.mss     = cpu_to_le16(mss);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4228
	context_desc->tcp_seg_setup.fields.hdr_len = hdr_len;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4229
	context_desc->cmd_and_length = cpu_to_le32(cmd_length);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4230
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4231
	buffer_info->time_stamp = jiffies;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4232
	buffer_info->next_to_watch = i;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4233
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4234
	i++;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4235
	if (i == tx_ring->count)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4236
		i = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4237
	tx_ring->next_to_use = i;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4238
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4239
	return 1;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4240
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4241
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4242
static bool e1000_tx_csum(struct e1000_adapter *adapter, struct sk_buff *skb)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4243
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4244
	struct e1000_ring *tx_ring = adapter->tx_ring;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4245
	struct e1000_context_desc *context_desc;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4246
	struct e1000_buffer *buffer_info;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4247
	unsigned int i;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4248
	u8 css;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4249
	u32 cmd_len = E1000_TXD_CMD_DEXT;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4250
	__be16 protocol;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4251
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4252
	if (skb->ip_summed != CHECKSUM_PARTIAL)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4253
		return 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4254
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4255
	if (skb->protocol == cpu_to_be16(ETH_P_8021Q))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4256
		protocol = vlan_eth_hdr(skb)->h_vlan_encapsulated_proto;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4257
	else
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4258
		protocol = skb->protocol;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4259
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4260
	switch (protocol) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4261
	case cpu_to_be16(ETH_P_IP):
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4262
		if (ip_hdr(skb)->protocol == IPPROTO_TCP)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4263
			cmd_len |= E1000_TXD_CMD_TCP;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4264
		break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4265
	case cpu_to_be16(ETH_P_IPV6):
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4266
		/* XXX not handling all IPV6 headers */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4267
		if (ipv6_hdr(skb)->nexthdr == IPPROTO_TCP)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4268
			cmd_len |= E1000_TXD_CMD_TCP;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4269
		break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4270
	default:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4271
		if (unlikely(net_ratelimit()))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4272
			e_warn("checksum_partial proto=%x!\n",
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4273
			       be16_to_cpu(protocol));
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4274
		break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4275
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4276
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4277
	css = skb_transport_offset(skb);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4278
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4279
	i = tx_ring->next_to_use;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4280
	buffer_info = &tx_ring->buffer_info[i];
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4281
	context_desc = E1000_CONTEXT_DESC(*tx_ring, i);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4282
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4283
	context_desc->lower_setup.ip_config = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4284
	context_desc->upper_setup.tcp_fields.tucss = css;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4285
	context_desc->upper_setup.tcp_fields.tucso =
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4286
				css + skb->csum_offset;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4287
	context_desc->upper_setup.tcp_fields.tucse = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4288
	context_desc->tcp_seg_setup.data = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4289
	context_desc->cmd_and_length = cpu_to_le32(cmd_len);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4290
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4291
	buffer_info->time_stamp = jiffies;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4292
	buffer_info->next_to_watch = i;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4293
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4294
	i++;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4295
	if (i == tx_ring->count)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4296
		i = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4297
	tx_ring->next_to_use = i;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4298
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4299
	return 1;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4300
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4301
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4302
#define E1000_MAX_PER_TXD	8192
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4303
#define E1000_MAX_TXD_PWR	12
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4304
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4305
static int e1000_tx_map(struct e1000_adapter *adapter,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4306
			struct sk_buff *skb, unsigned int first,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4307
			unsigned int max_per_txd, unsigned int nr_frags,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4308
			unsigned int mss)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4309
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4310
	struct e1000_ring *tx_ring = adapter->tx_ring;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4311
	struct pci_dev *pdev = adapter->pdev;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4312
	struct e1000_buffer *buffer_info;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4313
	unsigned int len = skb_headlen(skb);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4314
	unsigned int offset = 0, size, count = 0, i;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4315
	unsigned int f, bytecount, segs;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4316
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4317
	i = tx_ring->next_to_use;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4318
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4319
	while (len) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4320
		buffer_info = &tx_ring->buffer_info[i];
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4321
		size = min(len, max_per_txd);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4322
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4323
		buffer_info->length = size;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4324
		buffer_info->time_stamp = jiffies;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4325
		buffer_info->next_to_watch = i;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4326
		buffer_info->dma = dma_map_single(&pdev->dev,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4327
						  skb->data + offset,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4328
						  size,	DMA_TO_DEVICE);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4329
		buffer_info->mapped_as_page = false;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4330
		if (dma_mapping_error(&pdev->dev, buffer_info->dma))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4331
			goto dma_error;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4332
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4333
		len -= size;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4334
		offset += size;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4335
		count++;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4336
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4337
		if (len) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4338
			i++;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4339
			if (i == tx_ring->count)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4340
				i = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4341
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4342
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4343
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4344
	for (f = 0; f < nr_frags; f++) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4345
		struct skb_frag_struct *frag;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4346
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4347
		frag = &skb_shinfo(skb)->frags[f];
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4348
		len = frag->size;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4349
		offset = frag->page_offset;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4350
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4351
		while (len) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4352
			i++;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4353
			if (i == tx_ring->count)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4354
				i = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4355
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4356
			buffer_info = &tx_ring->buffer_info[i];
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4357
			size = min(len, max_per_txd);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4358
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4359
			buffer_info->length = size;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4360
			buffer_info->time_stamp = jiffies;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4361
			buffer_info->next_to_watch = i;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4362
			buffer_info->dma = dma_map_page(&pdev->dev, frag->page,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4363
							offset, size,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4364
							DMA_TO_DEVICE);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4365
			buffer_info->mapped_as_page = true;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4366
			if (dma_mapping_error(&pdev->dev, buffer_info->dma))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4367
				goto dma_error;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4368
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4369
			len -= size;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4370
			offset += size;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4371
			count++;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4372
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4373
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4374
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4375
	segs = skb_shinfo(skb)->gso_segs ?: 1;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4376
	/* multiply data chunks by size of headers */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4377
	bytecount = ((segs - 1) * skb_headlen(skb)) + skb->len;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4378
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4379
	tx_ring->buffer_info[i].skb = skb;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4380
	tx_ring->buffer_info[i].segs = segs;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4381
	tx_ring->buffer_info[i].bytecount = bytecount;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4382
	tx_ring->buffer_info[first].next_to_watch = i;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4383
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4384
	return count;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4385
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4386
dma_error:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4387
	dev_err(&pdev->dev, "TX DMA map failed\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4388
	buffer_info->dma = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4389
	if (count)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4390
		count--;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4391
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4392
	while (count--) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4393
		if (i==0)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4394
			i += tx_ring->count;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4395
		i--;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4396
		buffer_info = &tx_ring->buffer_info[i];
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4397
		e1000_put_txbuf(adapter, buffer_info);;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4398
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4399
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4400
	return 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4401
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4402
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4403
static void e1000_tx_queue(struct e1000_adapter *adapter,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4404
			   int tx_flags, int count)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4405
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4406
	struct e1000_ring *tx_ring = adapter->tx_ring;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4407
	struct e1000_tx_desc *tx_desc = NULL;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4408
	struct e1000_buffer *buffer_info;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4409
	u32 txd_upper = 0, txd_lower = E1000_TXD_CMD_IFCS;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4410
	unsigned int i;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4411
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4412
	if (tx_flags & E1000_TX_FLAGS_TSO) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4413
		txd_lower |= E1000_TXD_CMD_DEXT | E1000_TXD_DTYP_D |
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4414
			     E1000_TXD_CMD_TSE;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4415
		txd_upper |= E1000_TXD_POPTS_TXSM << 8;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4416
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4417
		if (tx_flags & E1000_TX_FLAGS_IPV4)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4418
			txd_upper |= E1000_TXD_POPTS_IXSM << 8;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4419
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4420
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4421
	if (tx_flags & E1000_TX_FLAGS_CSUM) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4422
		txd_lower |= E1000_TXD_CMD_DEXT | E1000_TXD_DTYP_D;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4423
		txd_upper |= E1000_TXD_POPTS_TXSM << 8;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4424
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4425
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4426
	if (tx_flags & E1000_TX_FLAGS_VLAN) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4427
		txd_lower |= E1000_TXD_CMD_VLE;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4428
		txd_upper |= (tx_flags & E1000_TX_FLAGS_VLAN_MASK);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4429
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4430
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4431
	i = tx_ring->next_to_use;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4432
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4433
	while (count--) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4434
		buffer_info = &tx_ring->buffer_info[i];
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4435
		tx_desc = E1000_TX_DESC(*tx_ring, i);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4436
		tx_desc->buffer_addr = cpu_to_le64(buffer_info->dma);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4437
		tx_desc->lower.data =
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4438
			cpu_to_le32(txd_lower | buffer_info->length);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4439
		tx_desc->upper.data = cpu_to_le32(txd_upper);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4440
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4441
		i++;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4442
		if (i == tx_ring->count)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4443
			i = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4444
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4445
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4446
	tx_desc->lower.data |= cpu_to_le32(adapter->txd_cmd);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4447
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4448
	/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4449
	 * Force memory writes to complete before letting h/w
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4450
	 * know there are new descriptors to fetch.  (Only
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4451
	 * applicable for weak-ordered memory model archs,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4452
	 * such as IA-64).
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4453
	 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4454
	wmb();
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4455
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4456
	tx_ring->next_to_use = i;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4457
	writel(i, adapter->hw.hw_addr + tx_ring->tail);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4458
	/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4459
	 * we need this if more than one processor can write to our tail
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4460
	 * at a time, it synchronizes IO on IA64/Altix systems
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4461
	 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4462
	mmiowb();
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4463
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4464
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4465
#define MINIMUM_DHCP_PACKET_SIZE 282
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4466
static int e1000_transfer_dhcp_info(struct e1000_adapter *adapter,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4467
				    struct sk_buff *skb)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4468
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4469
	struct e1000_hw *hw =  &adapter->hw;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4470
	u16 length, offset;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4471
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4472
	if (vlan_tx_tag_present(skb)) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4473
		if (!((vlan_tx_tag_get(skb) == adapter->hw.mng_cookie.vlan_id) &&
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4474
		    (adapter->hw.mng_cookie.status &
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4475
			E1000_MNG_DHCP_COOKIE_STATUS_VLAN)))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4476
			return 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4477
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4478
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4479
	if (skb->len <= MINIMUM_DHCP_PACKET_SIZE)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4480
		return 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4481
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4482
	if (((struct ethhdr *) skb->data)->h_proto != htons(ETH_P_IP))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4483
		return 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4484
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4485
	{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4486
		const struct iphdr *ip = (struct iphdr *)((u8 *)skb->data+14);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4487
		struct udphdr *udp;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4488
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4489
		if (ip->protocol != IPPROTO_UDP)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4490
			return 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4491
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4492
		udp = (struct udphdr *)((u8 *)ip + (ip->ihl << 2));
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4493
		if (ntohs(udp->dest) != 67)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4494
			return 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4495
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4496
		offset = (u8 *)udp + 8 - skb->data;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4497
		length = skb->len - offset;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4498
		return e1000e_mng_write_dhcp_info(hw, (u8 *)udp + 8, length);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4499
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4500
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4501
	return 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4502
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4503
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4504
static int __e1000_maybe_stop_tx(struct net_device *netdev, int size)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4505
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4506
	struct e1000_adapter *adapter = netdev_priv(netdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4507
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4508
	netif_stop_queue(netdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4509
	/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4510
	 * Herbert's original patch had:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4511
	 *  smp_mb__after_netif_stop_queue();
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4512
	 * but since that doesn't exist yet, just open code it.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4513
	 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4514
	smp_mb();
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4515
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4516
	/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4517
	 * We need to check again in a case another CPU has just
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4518
	 * made room available.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4519
	 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4520
	if (e1000_desc_unused(adapter->tx_ring) < size)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4521
		return -EBUSY;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4522
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4523
	/* A reprieve! */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4524
	netif_start_queue(netdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4525
	++adapter->restart_queue;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4526
	return 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4527
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4528
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4529
static int e1000_maybe_stop_tx(struct net_device *netdev, int size)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4530
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4531
	struct e1000_adapter *adapter = netdev_priv(netdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4532
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4533
	if (e1000_desc_unused(adapter->tx_ring) >= size)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4534
		return 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4535
	return __e1000_maybe_stop_tx(netdev, size);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4536
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4537
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4538
#define TXD_USE_COUNT(S, X) (((S) >> (X)) + 1 )
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4539
static netdev_tx_t e1000_xmit_frame(struct sk_buff *skb,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4540
				    struct net_device *netdev)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4541
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4542
	struct e1000_adapter *adapter = netdev_priv(netdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4543
	struct e1000_ring *tx_ring = adapter->tx_ring;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4544
	unsigned int first;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4545
	unsigned int max_per_txd = E1000_MAX_PER_TXD;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4546
	unsigned int max_txd_pwr = E1000_MAX_TXD_PWR;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4547
	unsigned int tx_flags = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4548
	unsigned int len = skb_headlen(skb);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4549
	unsigned int nr_frags;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4550
	unsigned int mss;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4551
	int count = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4552
	int tso;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4553
	unsigned int f;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4554
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4555
	if (test_bit(__E1000_DOWN, &adapter->state)) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4556
		dev_kfree_skb_any(skb);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4557
		return NETDEV_TX_OK;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4558
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4559
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4560
	if (skb->len <= 0) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4561
		dev_kfree_skb_any(skb);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4562
		return NETDEV_TX_OK;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4563
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4564
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4565
	mss = skb_shinfo(skb)->gso_size;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4566
	/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4567
	 * The controller does a simple calculation to
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4568
	 * make sure there is enough room in the FIFO before
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4569
	 * initiating the DMA for each buffer.  The calc is:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4570
	 * 4 = ceil(buffer len/mss).  To make sure we don't
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4571
	 * overrun the FIFO, adjust the max buffer len if mss
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4572
	 * drops.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4573
	 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4574
	if (mss) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4575
		u8 hdr_len;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4576
		max_per_txd = min(mss << 2, max_per_txd);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4577
		max_txd_pwr = fls(max_per_txd) - 1;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4578
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4579
		/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4580
		 * TSO Workaround for 82571/2/3 Controllers -- if skb->data
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4581
		 * points to just header, pull a few bytes of payload from
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4582
		 * frags into skb->data
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4583
		 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4584
		hdr_len = skb_transport_offset(skb) + tcp_hdrlen(skb);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4585
		/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4586
		 * we do this workaround for ES2LAN, but it is un-necessary,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4587
		 * avoiding it could save a lot of cycles
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4588
		 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4589
		if (skb->data_len && (hdr_len == len)) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4590
			unsigned int pull_size;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4591
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4592
			pull_size = min((unsigned int)4, skb->data_len);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4593
			if (!__pskb_pull_tail(skb, pull_size)) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4594
				e_err("__pskb_pull_tail failed.\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4595
				dev_kfree_skb_any(skb);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4596
				return NETDEV_TX_OK;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4597
			}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4598
			len = skb_headlen(skb);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4599
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4600
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4601
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4602
	/* reserve a descriptor for the offload context */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4603
	if ((mss) || (skb->ip_summed == CHECKSUM_PARTIAL))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4604
		count++;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4605
	count++;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4606
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4607
	count += TXD_USE_COUNT(len, max_txd_pwr);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4608
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4609
	nr_frags = skb_shinfo(skb)->nr_frags;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4610
	for (f = 0; f < nr_frags; f++)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4611
		count += TXD_USE_COUNT(skb_shinfo(skb)->frags[f].size,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4612
				       max_txd_pwr);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4613
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4614
	if (adapter->hw.mac.tx_pkt_filtering)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4615
		e1000_transfer_dhcp_info(adapter, skb);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4616
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4617
	/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4618
	 * need: count + 2 desc gap to keep tail from touching
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4619
	 * head, otherwise try next time
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4620
	 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4621
	if (e1000_maybe_stop_tx(netdev, count + 2))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4622
		return NETDEV_TX_BUSY;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4623
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4624
	if (adapter->vlgrp && vlan_tx_tag_present(skb)) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4625
		tx_flags |= E1000_TX_FLAGS_VLAN;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4626
		tx_flags |= (vlan_tx_tag_get(skb) << E1000_TX_FLAGS_VLAN_SHIFT);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4627
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4628
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4629
	first = tx_ring->next_to_use;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4630
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4631
	tso = e1000_tso(adapter, skb);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4632
	if (tso < 0) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4633
		dev_kfree_skb_any(skb);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4634
		return NETDEV_TX_OK;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4635
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4636
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4637
	if (tso)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4638
		tx_flags |= E1000_TX_FLAGS_TSO;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4639
	else if (e1000_tx_csum(adapter, skb))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4640
		tx_flags |= E1000_TX_FLAGS_CSUM;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4641
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4642
	/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4643
	 * Old method was to assume IPv4 packet by default if TSO was enabled.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4644
	 * 82571 hardware supports TSO capabilities for IPv6 as well...
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4645
	 * no longer assume, we must.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4646
	 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4647
	if (skb->protocol == htons(ETH_P_IP))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4648
		tx_flags |= E1000_TX_FLAGS_IPV4;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4649
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4650
	/* if count is 0 then mapping error has occured */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4651
	count = e1000_tx_map(adapter, skb, first, max_per_txd, nr_frags, mss);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4652
	if (count) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4653
		e1000_tx_queue(adapter, tx_flags, count);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4654
		/* Make sure there is space in the ring for the next send. */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4655
		e1000_maybe_stop_tx(netdev, MAX_SKB_FRAGS + 2);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4656
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4657
	} else {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4658
		dev_kfree_skb_any(skb);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4659
		tx_ring->buffer_info[first].time_stamp = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4660
		tx_ring->next_to_use = first;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4661
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4662
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4663
	return NETDEV_TX_OK;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4664
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4665
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4666
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4667
 * e1000_tx_timeout - Respond to a Tx Hang
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4668
 * @netdev: network interface device structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4669
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4670
static void e1000_tx_timeout(struct net_device *netdev)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4671
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4672
	struct e1000_adapter *adapter = netdev_priv(netdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4673
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4674
	/* Do the reset outside of interrupt context */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4675
	adapter->tx_timeout_count++;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4676
	schedule_work(&adapter->reset_task);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4677
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4678
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4679
static void e1000_reset_task(struct work_struct *work)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4680
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4681
	struct e1000_adapter *adapter;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4682
	adapter = container_of(work, struct e1000_adapter, reset_task);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4683
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4684
	e1000e_dump(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4685
	e_err("Reset adapter\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4686
	e1000e_reinit_locked(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4687
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4688
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4689
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4690
 * e1000_get_stats - Get System Network Statistics
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4691
 * @netdev: network interface device structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4692
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4693
 * Returns the address of the device statistics structure.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4694
 * The statistics are actually updated from the timer callback.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4695
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4696
static struct net_device_stats *e1000_get_stats(struct net_device *netdev)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4697
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4698
	/* only return the current stats */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4699
	return &netdev->stats;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4700
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4701
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4702
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4703
 * e1000_change_mtu - Change the Maximum Transfer Unit
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4704
 * @netdev: network interface device structure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4705
 * @new_mtu: new value for maximum frame size
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4706
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4707
 * Returns 0 on success, negative on failure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4708
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4709
static int e1000_change_mtu(struct net_device *netdev, int new_mtu)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4710
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4711
	struct e1000_adapter *adapter = netdev_priv(netdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4712
	int max_frame = new_mtu + ETH_HLEN + ETH_FCS_LEN;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4713
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4714
	/* Jumbo frame support */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4715
	if ((max_frame > ETH_FRAME_LEN + ETH_FCS_LEN) &&
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4716
	    !(adapter->flags & FLAG_HAS_JUMBO_FRAMES)) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4717
		e_err("Jumbo Frames not supported.\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4718
		return -EINVAL;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4719
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4720
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4721
	/* Supported frame sizes */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4722
	if ((new_mtu < ETH_ZLEN + ETH_FCS_LEN + VLAN_HLEN) ||
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4723
	    (max_frame > adapter->max_hw_frame_size)) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4724
		e_err("Unsupported MTU setting\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4725
		return -EINVAL;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4726
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4727
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4728
	/* 82573 Errata 17 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4729
	if (((adapter->hw.mac.type == e1000_82573) ||
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4730
	     (adapter->hw.mac.type == e1000_82574)) &&
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4731
	    (max_frame > ETH_FRAME_LEN + ETH_FCS_LEN)) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4732
		adapter->flags2 |= FLAG2_DISABLE_ASPM_L1;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4733
		e1000e_disable_aspm(adapter->pdev, PCIE_LINK_STATE_L1);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4734
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4735
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4736
	while (test_and_set_bit(__E1000_RESETTING, &adapter->state))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4737
		msleep(1);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4738
	/* e1000e_down -> e1000e_reset dependent on max_frame_size & mtu */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4739
	adapter->max_frame_size = max_frame;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4740
	e_info("changing MTU from %d to %d\n", netdev->mtu, new_mtu);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4741
	netdev->mtu = new_mtu;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4742
	if (netif_running(netdev))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4743
		e1000e_down(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4744
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4745
	/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4746
	 * NOTE: netdev_alloc_skb reserves 16 bytes, and typically NET_IP_ALIGN
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4747
	 * means we reserve 2 more, this pushes us to allocate from the next
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4748
	 * larger slab size.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4749
	 * i.e. RXBUFFER_2048 --> size-4096 slab
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4750
	 * However with the new *_jumbo_rx* routines, jumbo receives will use
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4751
	 * fragmented skbs
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4752
	 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4753
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4754
	if (max_frame <= 2048)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4755
		adapter->rx_buffer_len = 2048;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4756
	else
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4757
		adapter->rx_buffer_len = 4096;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4758
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4759
	/* adjust allocation if LPE protects us, and we aren't using SBP */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4760
	if ((max_frame == ETH_FRAME_LEN + ETH_FCS_LEN) ||
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4761
	     (max_frame == ETH_FRAME_LEN + VLAN_HLEN + ETH_FCS_LEN))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4762
		adapter->rx_buffer_len = ETH_FRAME_LEN + VLAN_HLEN
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4763
					 + ETH_FCS_LEN;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4764
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4765
	if (netif_running(netdev))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4766
		e1000e_up(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4767
	else
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4768
		e1000e_reset(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4769
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4770
	clear_bit(__E1000_RESETTING, &adapter->state);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4771
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4772
	return 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4773
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4774
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4775
static int e1000_mii_ioctl(struct net_device *netdev, struct ifreq *ifr,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4776
			   int cmd)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4777
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4778
	struct e1000_adapter *adapter = netdev_priv(netdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4779
	struct mii_ioctl_data *data = if_mii(ifr);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4780
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4781
	if (adapter->hw.phy.media_type != e1000_media_type_copper)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4782
		return -EOPNOTSUPP;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4783
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4784
	switch (cmd) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4785
	case SIOCGMIIPHY:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4786
		data->phy_id = adapter->hw.phy.addr;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4787
		break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4788
	case SIOCGMIIREG:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4789
		e1000_phy_read_status(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4790
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4791
		switch (data->reg_num & 0x1F) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4792
		case MII_BMCR:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4793
			data->val_out = adapter->phy_regs.bmcr;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4794
			break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4795
		case MII_BMSR:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4796
			data->val_out = adapter->phy_regs.bmsr;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4797
			break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4798
		case MII_PHYSID1:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4799
			data->val_out = (adapter->hw.phy.id >> 16);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4800
			break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4801
		case MII_PHYSID2:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4802
			data->val_out = (adapter->hw.phy.id & 0xFFFF);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4803
			break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4804
		case MII_ADVERTISE:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4805
			data->val_out = adapter->phy_regs.advertise;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4806
			break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4807
		case MII_LPA:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4808
			data->val_out = adapter->phy_regs.lpa;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4809
			break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4810
		case MII_EXPANSION:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4811
			data->val_out = adapter->phy_regs.expansion;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4812
			break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4813
		case MII_CTRL1000:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4814
			data->val_out = adapter->phy_regs.ctrl1000;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4815
			break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4816
		case MII_STAT1000:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4817
			data->val_out = adapter->phy_regs.stat1000;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4818
			break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4819
		case MII_ESTATUS:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4820
			data->val_out = adapter->phy_regs.estatus;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4821
			break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4822
		default:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4823
			return -EIO;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4824
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4825
		break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4826
	case SIOCSMIIREG:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4827
	default:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4828
		return -EOPNOTSUPP;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4829
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4830
	return 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4831
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4832
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4833
static int e1000_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4834
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4835
	switch (cmd) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4836
	case SIOCGMIIPHY:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4837
	case SIOCGMIIREG:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4838
	case SIOCSMIIREG:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4839
		return e1000_mii_ioctl(netdev, ifr, cmd);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4840
	default:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4841
		return -EOPNOTSUPP;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4842
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4843
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4844
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4845
static int e1000_init_phy_wakeup(struct e1000_adapter *adapter, u32 wufc)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4846
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4847
	struct e1000_hw *hw = &adapter->hw;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4848
	u32 i, mac_reg;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4849
	u16 phy_reg;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4850
	int retval = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4851
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4852
	/* copy MAC RARs to PHY RARs */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4853
	for (i = 0; i < adapter->hw.mac.rar_entry_count; i++) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4854
		mac_reg = er32(RAL(i));
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4855
		e1e_wphy(hw, BM_RAR_L(i), (u16)(mac_reg & 0xFFFF));
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4856
		e1e_wphy(hw, BM_RAR_M(i), (u16)((mac_reg >> 16) & 0xFFFF));
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4857
		mac_reg = er32(RAH(i));
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4858
		e1e_wphy(hw, BM_RAR_H(i), (u16)(mac_reg & 0xFFFF));
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4859
		e1e_wphy(hw, BM_RAR_CTRL(i), (u16)((mac_reg >> 16) & 0xFFFF));
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4860
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4861
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4862
	/* copy MAC MTA to PHY MTA */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4863
	for (i = 0; i < adapter->hw.mac.mta_reg_count; i++) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4864
		mac_reg = E1000_READ_REG_ARRAY(hw, E1000_MTA, i);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4865
		e1e_wphy(hw, BM_MTA(i), (u16)(mac_reg & 0xFFFF));
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4866
		e1e_wphy(hw, BM_MTA(i) + 1, (u16)((mac_reg >> 16) & 0xFFFF));
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4867
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4868
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4869
	/* configure PHY Rx Control register */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4870
	e1e_rphy(&adapter->hw, BM_RCTL, &phy_reg);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4871
	mac_reg = er32(RCTL);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4872
	if (mac_reg & E1000_RCTL_UPE)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4873
		phy_reg |= BM_RCTL_UPE;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4874
	if (mac_reg & E1000_RCTL_MPE)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4875
		phy_reg |= BM_RCTL_MPE;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4876
	phy_reg &= ~(BM_RCTL_MO_MASK);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4877
	if (mac_reg & E1000_RCTL_MO_3)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4878
		phy_reg |= (((mac_reg & E1000_RCTL_MO_3) >> E1000_RCTL_MO_SHIFT)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4879
				<< BM_RCTL_MO_SHIFT);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4880
	if (mac_reg & E1000_RCTL_BAM)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4881
		phy_reg |= BM_RCTL_BAM;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4882
	if (mac_reg & E1000_RCTL_PMCF)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4883
		phy_reg |= BM_RCTL_PMCF;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4884
	mac_reg = er32(CTRL);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4885
	if (mac_reg & E1000_CTRL_RFCE)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4886
		phy_reg |= BM_RCTL_RFCE;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4887
	e1e_wphy(&adapter->hw, BM_RCTL, phy_reg);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4888
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4889
	/* enable PHY wakeup in MAC register */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4890
	ew32(WUFC, wufc);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4891
	ew32(WUC, E1000_WUC_PHY_WAKE | E1000_WUC_PME_EN);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4892
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4893
	/* configure and enable PHY wakeup in PHY registers */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4894
	e1e_wphy(&adapter->hw, BM_WUFC, wufc);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4895
	e1e_wphy(&adapter->hw, BM_WUC, E1000_WUC_PME_EN);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4896
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4897
	/* activate PHY wakeup */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4898
	retval = hw->phy.ops.acquire(hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4899
	if (retval) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4900
		e_err("Could not acquire PHY\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4901
		return retval;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4902
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4903
	e1000e_write_phy_reg_mdic(hw, IGP01E1000_PHY_PAGE_SELECT,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4904
	                         (BM_WUC_ENABLE_PAGE << IGP_PAGE_SHIFT));
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4905
	retval = e1000e_read_phy_reg_mdic(hw, BM_WUC_ENABLE_REG, &phy_reg);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4906
	if (retval) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4907
		e_err("Could not read PHY page 769\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4908
		goto out;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4909
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4910
	phy_reg |= BM_WUC_ENABLE_BIT | BM_WUC_HOST_WU_BIT;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4911
	retval = e1000e_write_phy_reg_mdic(hw, BM_WUC_ENABLE_REG, phy_reg);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4912
	if (retval)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4913
		e_err("Could not set PHY Host Wakeup bit\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4914
out:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4915
	hw->phy.ops.release(hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4916
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4917
	return retval;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4918
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4919
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4920
static int __e1000_shutdown(struct pci_dev *pdev, bool *enable_wake,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4921
			    bool runtime)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4922
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4923
	struct net_device *netdev = pci_get_drvdata(pdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4924
	struct e1000_adapter *adapter = netdev_priv(netdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4925
	struct e1000_hw *hw = &adapter->hw;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4926
	u32 ctrl, ctrl_ext, rctl, status;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4927
	/* Runtime suspend should only enable wakeup for link changes */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4928
	u32 wufc = runtime ? E1000_WUFC_LNKC : adapter->wol;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4929
	int retval = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4930
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4931
	netif_device_detach(netdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4932
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4933
	if (netif_running(netdev)) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4934
		WARN_ON(test_bit(__E1000_RESETTING, &adapter->state));
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4935
		e1000e_down(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4936
		e1000_free_irq(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4937
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4938
	e1000e_reset_interrupt_capability(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4939
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4940
	retval = pci_save_state(pdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4941
	if (retval)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4942
		return retval;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4943
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4944
	status = er32(STATUS);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4945
	if (status & E1000_STATUS_LU)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4946
		wufc &= ~E1000_WUFC_LNKC;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4947
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4948
	if (wufc) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4949
		e1000_setup_rctl(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4950
		e1000_set_multi(netdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4951
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4952
		/* turn on all-multi mode if wake on multicast is enabled */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4953
		if (wufc & E1000_WUFC_MC) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4954
			rctl = er32(RCTL);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4955
			rctl |= E1000_RCTL_MPE;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4956
			ew32(RCTL, rctl);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4957
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4958
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4959
		ctrl = er32(CTRL);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4960
		/* advertise wake from D3Cold */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4961
		#define E1000_CTRL_ADVD3WUC 0x00100000
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4962
		/* phy power management enable */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4963
		#define E1000_CTRL_EN_PHY_PWR_MGMT 0x00200000
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4964
		ctrl |= E1000_CTRL_ADVD3WUC;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4965
		if (!(adapter->flags2 & FLAG2_HAS_PHY_WAKEUP))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4966
			ctrl |= E1000_CTRL_EN_PHY_PWR_MGMT;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4967
		ew32(CTRL, ctrl);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4968
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4969
		if (adapter->hw.phy.media_type == e1000_media_type_fiber ||
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4970
		    adapter->hw.phy.media_type ==
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4971
		    e1000_media_type_internal_serdes) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4972
			/* keep the laser running in D3 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4973
			ctrl_ext = er32(CTRL_EXT);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4974
			ctrl_ext |= E1000_CTRL_EXT_SDP3_DATA;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4975
			ew32(CTRL_EXT, ctrl_ext);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4976
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4977
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4978
		if (adapter->flags & FLAG_IS_ICH)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4979
			e1000e_disable_gig_wol_ich8lan(&adapter->hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4980
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4981
		/* Allow time for pending master requests to run */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4982
		e1000e_disable_pcie_master(&adapter->hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4983
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4984
		if (adapter->flags2 & FLAG2_HAS_PHY_WAKEUP) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4985
			/* enable wakeup by the PHY */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4986
			retval = e1000_init_phy_wakeup(adapter, wufc);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4987
			if (retval)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4988
				return retval;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4989
		} else {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4990
			/* enable wakeup by the MAC */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4991
			ew32(WUFC, wufc);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4992
			ew32(WUC, E1000_WUC_PME_EN);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4993
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4994
	} else {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4995
		ew32(WUC, 0);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4996
		ew32(WUFC, 0);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4997
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4998
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4999
	*enable_wake = !!wufc;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5000
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5001
	/* make sure adapter isn't asleep if manageability is enabled */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5002
	if ((adapter->flags & FLAG_MNG_PT_ENABLED) ||
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5003
	    (hw->mac.ops.check_mng_mode(hw)))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5004
		*enable_wake = true;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5005
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5006
	if (adapter->hw.phy.type == e1000_phy_igp_3)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5007
		e1000e_igp3_phy_powerdown_workaround_ich8lan(&adapter->hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5008
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5009
	/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5010
	 * Release control of h/w to f/w.  If f/w is AMT enabled, this
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5011
	 * would have already happened in close and is redundant.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5012
	 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5013
	e1000_release_hw_control(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5014
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5015
	pci_disable_device(pdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5016
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5017
	return 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5018
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5019
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5020
static void e1000_power_off(struct pci_dev *pdev, bool sleep, bool wake)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5021
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5022
	if (sleep && wake) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5023
		pci_prepare_to_sleep(pdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5024
		return;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5025
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5026
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5027
	pci_wake_from_d3(pdev, wake);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5028
	pci_set_power_state(pdev, PCI_D3hot);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5029
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5030
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5031
static void e1000_complete_shutdown(struct pci_dev *pdev, bool sleep,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5032
                                    bool wake)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5033
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5034
	struct net_device *netdev = pci_get_drvdata(pdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5035
	struct e1000_adapter *adapter = netdev_priv(netdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5036
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5037
	/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5038
	 * The pci-e switch on some quad port adapters will report a
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5039
	 * correctable error when the MAC transitions from D0 to D3.  To
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5040
	 * prevent this we need to mask off the correctable errors on the
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5041
	 * downstream port of the pci-e switch.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5042
	 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5043
	if (adapter->flags & FLAG_IS_QUAD_PORT) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5044
		struct pci_dev *us_dev = pdev->bus->self;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5045
		int pos = pci_find_capability(us_dev, PCI_CAP_ID_EXP);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5046
		u16 devctl;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5047
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5048
		pci_read_config_word(us_dev, pos + PCI_EXP_DEVCTL, &devctl);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5049
		pci_write_config_word(us_dev, pos + PCI_EXP_DEVCTL,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5050
		                      (devctl & ~PCI_EXP_DEVCTL_CERE));
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5051
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5052
		e1000_power_off(pdev, sleep, wake);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5053
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5054
		pci_write_config_word(us_dev, pos + PCI_EXP_DEVCTL, devctl);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5055
	} else {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5056
		e1000_power_off(pdev, sleep, wake);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5057
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5058
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5059
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5060
#ifdef CONFIG_PCIEASPM
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5061
static void __e1000e_disable_aspm(struct pci_dev *pdev, u16 state)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5062
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5063
	pci_disable_link_state(pdev, state);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5064
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5065
#else
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5066
static void __e1000e_disable_aspm(struct pci_dev *pdev, u16 state)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5067
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5068
	int pos;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5069
	u16 reg16;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5070
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5071
	/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5072
	 * Both device and parent should have the same ASPM setting.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5073
	 * Disable ASPM in downstream component first and then upstream.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5074
	 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5075
	pos = pci_pcie_cap(pdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5076
	pci_read_config_word(pdev, pos + PCI_EXP_LNKCTL, &reg16);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5077
	reg16 &= ~state;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5078
	pci_write_config_word(pdev, pos + PCI_EXP_LNKCTL, reg16);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5079
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5080
	if (!pdev->bus->self)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5081
		return;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5082
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5083
	pos = pci_pcie_cap(pdev->bus->self);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5084
	pci_read_config_word(pdev->bus->self, pos + PCI_EXP_LNKCTL, &reg16);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5085
	reg16 &= ~state;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5086
	pci_write_config_word(pdev->bus->self, pos + PCI_EXP_LNKCTL, reg16);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5087
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5088
#endif
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5089
void e1000e_disable_aspm(struct pci_dev *pdev, u16 state)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5090
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5091
	dev_info(&pdev->dev, "Disabling ASPM %s %s\n",
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5092
		 (state & PCIE_LINK_STATE_L0S) ? "L0s" : "",
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5093
		 (state & PCIE_LINK_STATE_L1) ? "L1" : "");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5094
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5095
	__e1000e_disable_aspm(pdev, state);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5096
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5097
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5098
#ifdef CONFIG_PM_OPS
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5099
static bool e1000e_pm_ready(struct e1000_adapter *adapter)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5100
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5101
	return !!adapter->tx_ring->buffer_info;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5102
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5103
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5104
static int __e1000_resume(struct pci_dev *pdev)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5105
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5106
	struct net_device *netdev = pci_get_drvdata(pdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5107
	struct e1000_adapter *adapter = netdev_priv(netdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5108
	struct e1000_hw *hw = &adapter->hw;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5109
	u32 err;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5110
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5111
	pci_set_power_state(pdev, PCI_D0);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5112
	pci_restore_state(pdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5113
	pci_save_state(pdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5114
	if (adapter->flags2 & FLAG2_DISABLE_ASPM_L1)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5115
		e1000e_disable_aspm(pdev, PCIE_LINK_STATE_L1);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5116
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5117
	e1000e_set_interrupt_capability(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5118
	if (netif_running(netdev)) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5119
		err = e1000_request_irq(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5120
		if (err)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5121
			return err;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5122
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5123
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5124
	e1000e_power_up_phy(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5125
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5126
	/* report the system wakeup cause from S3/S4 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5127
	if (adapter->flags2 & FLAG2_HAS_PHY_WAKEUP) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5128
		u16 phy_data;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5129
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5130
		e1e_rphy(&adapter->hw, BM_WUS, &phy_data);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5131
		if (phy_data) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5132
			e_info("PHY Wakeup cause - %s\n",
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5133
				phy_data & E1000_WUS_EX ? "Unicast Packet" :
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5134
				phy_data & E1000_WUS_MC ? "Multicast Packet" :
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5135
				phy_data & E1000_WUS_BC ? "Broadcast Packet" :
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5136
				phy_data & E1000_WUS_MAG ? "Magic Packet" :
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5137
				phy_data & E1000_WUS_LNKC ? "Link Status "
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5138
				" Change" : "other");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5139
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5140
		e1e_wphy(&adapter->hw, BM_WUS, ~0);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5141
	} else {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5142
		u32 wus = er32(WUS);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5143
		if (wus) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5144
			e_info("MAC Wakeup cause - %s\n",
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5145
				wus & E1000_WUS_EX ? "Unicast Packet" :
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5146
				wus & E1000_WUS_MC ? "Multicast Packet" :
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5147
				wus & E1000_WUS_BC ? "Broadcast Packet" :
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5148
				wus & E1000_WUS_MAG ? "Magic Packet" :
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5149
				wus & E1000_WUS_LNKC ? "Link Status Change" :
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5150
				"other");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5151
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5152
		ew32(WUS, ~0);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5153
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5154
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5155
	e1000e_reset(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5156
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5157
	e1000_init_manageability_pt(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5158
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5159
	if (netif_running(netdev))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5160
		e1000e_up(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5161
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5162
	netif_device_attach(netdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5163
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5164
	/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5165
	 * If the controller has AMT, do not set DRV_LOAD until the interface
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5166
	 * is up.  For all other cases, let the f/w know that the h/w is now
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5167
	 * under the control of the driver.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5168
	 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5169
	if (!(adapter->flags & FLAG_HAS_AMT))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5170
		e1000_get_hw_control(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5171
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5172
	return 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5173
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5174
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5175
#ifdef CONFIG_PM_SLEEP
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5176
static int e1000_suspend(struct device *dev)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5177
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5178
	struct pci_dev *pdev = to_pci_dev(dev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5179
	int retval;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5180
	bool wake;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5181
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5182
	retval = __e1000_shutdown(pdev, &wake, false);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5183
	if (!retval)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5184
		e1000_complete_shutdown(pdev, true, wake);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5185
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5186
	return retval;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5187
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5188
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5189
static int e1000_resume(struct device *dev)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5190
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5191
	struct pci_dev *pdev = to_pci_dev(dev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5192
	struct net_device *netdev = pci_get_drvdata(pdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5193
	struct e1000_adapter *adapter = netdev_priv(netdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5194
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5195
	if (e1000e_pm_ready(adapter))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5196
		adapter->idle_check = true;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5197
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5198
	return __e1000_resume(pdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5199
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5200
#endif /* CONFIG_PM_SLEEP */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5201
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5202
#ifdef CONFIG_PM_RUNTIME
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5203
static int e1000_runtime_suspend(struct device *dev)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5204
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5205
	struct pci_dev *pdev = to_pci_dev(dev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5206
	struct net_device *netdev = pci_get_drvdata(pdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5207
	struct e1000_adapter *adapter = netdev_priv(netdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5208
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5209
	if (e1000e_pm_ready(adapter)) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5210
		bool wake;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5211
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5212
		__e1000_shutdown(pdev, &wake, true);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5213
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5214
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5215
	return 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5216
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5217
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5218
static int e1000_idle(struct device *dev)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5219
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5220
	struct pci_dev *pdev = to_pci_dev(dev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5221
	struct net_device *netdev = pci_get_drvdata(pdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5222
	struct e1000_adapter *adapter = netdev_priv(netdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5223
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5224
	if (!e1000e_pm_ready(adapter))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5225
		return 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5226
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5227
	if (adapter->idle_check) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5228
		adapter->idle_check = false;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5229
		if (!e1000e_has_link(adapter))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5230
			pm_schedule_suspend(dev, MSEC_PER_SEC);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5231
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5232
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5233
	return -EBUSY;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5234
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5235
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5236
static int e1000_runtime_resume(struct device *dev)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5237
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5238
	struct pci_dev *pdev = to_pci_dev(dev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5239
	struct net_device *netdev = pci_get_drvdata(pdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5240
	struct e1000_adapter *adapter = netdev_priv(netdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5241
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5242
	if (!e1000e_pm_ready(adapter))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5243
		return 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5244
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5245
	adapter->idle_check = !dev->power.runtime_auto;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5246
	return __e1000_resume(pdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5247
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5248
#endif /* CONFIG_PM_RUNTIME */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5249
#endif /* CONFIG_PM_OPS */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5250
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5251
static void e1000_shutdown(struct pci_dev *pdev)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5252
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5253
	bool wake = false;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5254
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5255
	__e1000_shutdown(pdev, &wake, false);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5256
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5257
	if (system_state == SYSTEM_POWER_OFF)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5258
		e1000_complete_shutdown(pdev, false, wake);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5259
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5260
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5261
#ifdef CONFIG_NET_POLL_CONTROLLER
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5262
/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5263
 * Polling 'interrupt' - used by things like netconsole to send skbs
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5264
 * without having to re-enable interrupts. It's not called while
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5265
 * the interrupt routine is executing.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5266
 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5267
static void e1000_netpoll(struct net_device *netdev)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5268
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5269
	struct e1000_adapter *adapter = netdev_priv(netdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5270
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5271
	disable_irq(adapter->pdev->irq);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5272
	e1000_intr(adapter->pdev->irq, netdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5273
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5274
	enable_irq(adapter->pdev->irq);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5275
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5276
#endif
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5277
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5278
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5279
 * e1000_io_error_detected - called when PCI error is detected
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5280
 * @pdev: Pointer to PCI device
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5281
 * @state: The current pci connection state
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5282
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5283
 * This function is called after a PCI bus error affecting
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5284
 * this device has been detected.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5285
 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5286
static pci_ers_result_t e1000_io_error_detected(struct pci_dev *pdev,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5287
						pci_channel_state_t state)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5288
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5289
	struct net_device *netdev = pci_get_drvdata(pdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5290
	struct e1000_adapter *adapter = netdev_priv(netdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5291
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5292
	netif_device_detach(netdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5293
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5294
	if (state == pci_channel_io_perm_failure)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5295
		return PCI_ERS_RESULT_DISCONNECT;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5296
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5297
	if (netif_running(netdev))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5298
		e1000e_down(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5299
	pci_disable_device(pdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5300
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5301
	/* Request a slot slot reset. */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5302
	return PCI_ERS_RESULT_NEED_RESET;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5303
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5304
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5305
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5306
 * e1000_io_slot_reset - called after the pci bus has been reset.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5307
 * @pdev: Pointer to PCI device
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5308
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5309
 * Restart the card from scratch, as if from a cold-boot. Implementation
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5310
 * resembles the first-half of the e1000_resume routine.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5311
 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5312
static pci_ers_result_t e1000_io_slot_reset(struct pci_dev *pdev)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5313
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5314
	struct net_device *netdev = pci_get_drvdata(pdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5315
	struct e1000_adapter *adapter = netdev_priv(netdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5316
	struct e1000_hw *hw = &adapter->hw;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5317
	int err;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5318
	pci_ers_result_t result;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5319
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5320
	if (adapter->flags2 & FLAG2_DISABLE_ASPM_L1)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5321
		e1000e_disable_aspm(pdev, PCIE_LINK_STATE_L1);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5322
	err = pci_enable_device_mem(pdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5323
	if (err) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5324
		dev_err(&pdev->dev,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5325
			"Cannot re-enable PCI device after reset.\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5326
		result = PCI_ERS_RESULT_DISCONNECT;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5327
	} else {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5328
		pci_set_master(pdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5329
		pdev->state_saved = true;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5330
		pci_restore_state(pdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5331
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5332
		pci_enable_wake(pdev, PCI_D3hot, 0);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5333
		pci_enable_wake(pdev, PCI_D3cold, 0);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5334
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5335
		e1000e_reset(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5336
		ew32(WUS, ~0);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5337
		result = PCI_ERS_RESULT_RECOVERED;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5338
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5339
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5340
	pci_cleanup_aer_uncorrect_error_status(pdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5341
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5342
	return result;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5343
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5344
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5345
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5346
 * e1000_io_resume - called when traffic can start flowing again.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5347
 * @pdev: Pointer to PCI device
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5348
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5349
 * This callback is called when the error recovery driver tells us that
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5350
 * its OK to resume normal operation. Implementation resembles the
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5351
 * second-half of the e1000_resume routine.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5352
 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5353
static void e1000_io_resume(struct pci_dev *pdev)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5354
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5355
	struct net_device *netdev = pci_get_drvdata(pdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5356
	struct e1000_adapter *adapter = netdev_priv(netdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5357
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5358
	e1000_init_manageability_pt(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5359
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5360
	if (netif_running(netdev)) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5361
		if (e1000e_up(adapter)) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5362
			dev_err(&pdev->dev,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5363
				"can't bring device back up after reset\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5364
			return;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5365
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5366
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5367
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5368
	netif_device_attach(netdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5369
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5370
	/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5371
	 * If the controller has AMT, do not set DRV_LOAD until the interface
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5372
	 * is up.  For all other cases, let the f/w know that the h/w is now
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5373
	 * under the control of the driver.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5374
	 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5375
	if (!(adapter->flags & FLAG_HAS_AMT))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5376
		e1000_get_hw_control(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5377
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5378
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5379
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5380
static void e1000_print_device_info(struct e1000_adapter *adapter)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5381
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5382
	struct e1000_hw *hw = &adapter->hw;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5383
	struct net_device *netdev = adapter->netdev;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5384
	u32 pba_num;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5385
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5386
	/* print bus type/speed/width info */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5387
	e_info("(PCI Express:2.5GB/s:%s) %pM\n",
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5388
	       /* bus width */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5389
	       ((hw->bus.width == e1000_bus_width_pcie_x4) ? "Width x4" :
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5390
	        "Width x1"),
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5391
	       /* MAC address */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5392
	       netdev->dev_addr);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5393
	e_info("Intel(R) PRO/%s Network Connection\n",
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5394
	       (hw->phy.type == e1000_phy_ife) ? "10/100" : "1000");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5395
	e1000e_read_pba_num(hw, &pba_num);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5396
	e_info("MAC: %d, PHY: %d, PBA No: %06x-%03x\n",
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5397
	       hw->mac.type, hw->phy.type, (pba_num >> 8), (pba_num & 0xff));
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5398
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5399
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5400
static void e1000_eeprom_checks(struct e1000_adapter *adapter)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5401
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5402
	struct e1000_hw *hw = &adapter->hw;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5403
	int ret_val;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5404
	u16 buf = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5405
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5406
	if (hw->mac.type != e1000_82573)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5407
		return;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5408
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5409
	ret_val = e1000_read_nvm(hw, NVM_INIT_CONTROL2_REG, 1, &buf);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5410
	if (!ret_val && (!(le16_to_cpu(buf) & (1 << 0)))) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5411
		/* Deep Smart Power Down (DSPD) */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5412
		dev_warn(&adapter->pdev->dev,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5413
			 "Warning: detected DSPD enabled in EEPROM\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5414
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5415
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5416
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5417
static const struct net_device_ops e1000e_netdev_ops = {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5418
	.ndo_open		= e1000_open,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5419
	.ndo_stop		= e1000_close,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5420
	.ndo_start_xmit		= e1000_xmit_frame,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5421
	.ndo_get_stats		= e1000_get_stats,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5422
	.ndo_set_multicast_list	= e1000_set_multi,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5423
	.ndo_set_mac_address	= e1000_set_mac,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5424
	.ndo_change_mtu		= e1000_change_mtu,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5425
	.ndo_do_ioctl		= e1000_ioctl,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5426
	.ndo_tx_timeout		= e1000_tx_timeout,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5427
	.ndo_validate_addr	= eth_validate_addr,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5428
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5429
	.ndo_vlan_rx_register	= e1000_vlan_rx_register,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5430
	.ndo_vlan_rx_add_vid	= e1000_vlan_rx_add_vid,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5431
	.ndo_vlan_rx_kill_vid	= e1000_vlan_rx_kill_vid,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5432
#ifdef CONFIG_NET_POLL_CONTROLLER
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5433
	.ndo_poll_controller	= e1000_netpoll,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5434
#endif
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5435
};
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5436
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5437
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5438
 * e1000_probe - Device Initialization Routine
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5439
 * @pdev: PCI device information struct
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5440
 * @ent: entry in e1000_pci_tbl
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5441
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5442
 * Returns 0 on success, negative on failure
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5443
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5444
 * e1000_probe initializes an adapter identified by a pci_dev structure.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5445
 * The OS initialization, configuring of the adapter private structure,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5446
 * and a hardware reset occur.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5447
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5448
static int __devinit e1000_probe(struct pci_dev *pdev,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5449
				 const struct pci_device_id *ent)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5450
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5451
	struct net_device *netdev;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5452
	struct e1000_adapter *adapter;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5453
	struct e1000_hw *hw;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5454
	const struct e1000_info *ei = e1000_info_tbl[ent->driver_data];
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5455
	resource_size_t mmio_start, mmio_len;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5456
	resource_size_t flash_start, flash_len;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5457
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5458
	static int cards_found;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5459
	int i, err, pci_using_dac;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5460
	u16 eeprom_data = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5461
	u16 eeprom_apme_mask = E1000_EEPROM_APME;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5462
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5463
	if (ei->flags2 & FLAG2_DISABLE_ASPM_L1)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5464
		e1000e_disable_aspm(pdev, PCIE_LINK_STATE_L1);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5465
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5466
	err = pci_enable_device_mem(pdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5467
	if (err)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5468
		return err;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5469
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5470
	pci_using_dac = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5471
	err = dma_set_mask(&pdev->dev, DMA_BIT_MASK(64));
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5472
	if (!err) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5473
		err = dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(64));
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5474
		if (!err)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5475
			pci_using_dac = 1;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5476
	} else {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5477
		err = dma_set_mask(&pdev->dev, DMA_BIT_MASK(32));
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5478
		if (err) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5479
			err = dma_set_coherent_mask(&pdev->dev,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5480
						    DMA_BIT_MASK(32));
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5481
			if (err) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5482
				dev_err(&pdev->dev, "No usable DMA "
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5483
					"configuration, aborting\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5484
				goto err_dma;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5485
			}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5486
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5487
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5488
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5489
	err = pci_request_selected_regions_exclusive(pdev,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5490
	                                  pci_select_bars(pdev, IORESOURCE_MEM),
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5491
	                                  e1000e_driver_name);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5492
	if (err)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5493
		goto err_pci_reg;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5494
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5495
	/* AER (Advanced Error Reporting) hooks */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5496
	pci_enable_pcie_error_reporting(pdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5497
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5498
	pci_set_master(pdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5499
	/* PCI config space info */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5500
	err = pci_save_state(pdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5501
	if (err)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5502
		goto err_alloc_etherdev;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5503
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5504
	err = -ENOMEM;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5505
	netdev = alloc_etherdev(sizeof(struct e1000_adapter));
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5506
	if (!netdev)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5507
		goto err_alloc_etherdev;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5508
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5509
	SET_NETDEV_DEV(netdev, &pdev->dev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5510
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5511
	netdev->irq = pdev->irq;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5512
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5513
	pci_set_drvdata(pdev, netdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5514
	adapter = netdev_priv(netdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5515
	hw = &adapter->hw;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5516
	adapter->netdev = netdev;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5517
	adapter->pdev = pdev;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5518
	adapter->ei = ei;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5519
	adapter->pba = ei->pba;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5520
	adapter->flags = ei->flags;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5521
	adapter->flags2 = ei->flags2;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5522
	adapter->hw.adapter = adapter;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5523
	adapter->hw.mac.type = ei->mac;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5524
	adapter->max_hw_frame_size = ei->max_hw_frame_size;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5525
	adapter->msg_enable = (1 << NETIF_MSG_DRV | NETIF_MSG_PROBE) - 1;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5526
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5527
	mmio_start = pci_resource_start(pdev, 0);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5528
	mmio_len = pci_resource_len(pdev, 0);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5529
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5530
	err = -EIO;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5531
	adapter->hw.hw_addr = ioremap(mmio_start, mmio_len);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5532
	if (!adapter->hw.hw_addr)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5533
		goto err_ioremap;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5534
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5535
	if ((adapter->flags & FLAG_HAS_FLASH) &&
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5536
	    (pci_resource_flags(pdev, 1) & IORESOURCE_MEM)) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5537
		flash_start = pci_resource_start(pdev, 1);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5538
		flash_len = pci_resource_len(pdev, 1);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5539
		adapter->hw.flash_address = ioremap(flash_start, flash_len);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5540
		if (!adapter->hw.flash_address)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5541
			goto err_flashmap;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5542
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5543
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5544
	/* construct the net_device struct */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5545
	netdev->netdev_ops		= &e1000e_netdev_ops;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5546
	e1000e_set_ethtool_ops(netdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5547
	netdev->watchdog_timeo		= 5 * HZ;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5548
	netif_napi_add(netdev, &adapter->napi, e1000_clean, 64);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5549
	strncpy(netdev->name, pci_name(pdev), sizeof(netdev->name) - 1);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5550
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5551
	netdev->mem_start = mmio_start;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5552
	netdev->mem_end = mmio_start + mmio_len;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5553
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5554
	adapter->bd_number = cards_found++;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5555
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5556
	e1000e_check_options(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5557
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5558
	/* setup adapter struct */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5559
	err = e1000_sw_init(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5560
	if (err)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5561
		goto err_sw_init;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5562
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5563
	err = -EIO;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5564
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5565
	memcpy(&hw->mac.ops, ei->mac_ops, sizeof(hw->mac.ops));
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5566
	memcpy(&hw->nvm.ops, ei->nvm_ops, sizeof(hw->nvm.ops));
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5567
	memcpy(&hw->phy.ops, ei->phy_ops, sizeof(hw->phy.ops));
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5568
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5569
	err = ei->get_variants(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5570
	if (err)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5571
		goto err_hw_init;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5572
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5573
	if ((adapter->flags & FLAG_IS_ICH) &&
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5574
	    (adapter->flags & FLAG_READ_ONLY_NVM))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5575
		e1000e_write_protect_nvm_ich8lan(&adapter->hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5576
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5577
	hw->mac.ops.get_bus_info(&adapter->hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5578
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5579
	adapter->hw.phy.autoneg_wait_to_complete = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5580
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5581
	/* Copper options */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5582
	if (adapter->hw.phy.media_type == e1000_media_type_copper) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5583
		adapter->hw.phy.mdix = AUTO_ALL_MODES;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5584
		adapter->hw.phy.disable_polarity_correction = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5585
		adapter->hw.phy.ms_type = e1000_ms_hw_default;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5586
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5587
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5588
	if (e1000_check_reset_block(&adapter->hw))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5589
		e_info("PHY reset is blocked due to SOL/IDER session.\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5590
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5591
	netdev->features = NETIF_F_SG |
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5592
			   NETIF_F_HW_CSUM |
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5593
			   NETIF_F_HW_VLAN_TX |
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5594
			   NETIF_F_HW_VLAN_RX;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5595
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5596
	if (adapter->flags & FLAG_HAS_HW_VLAN_FILTER)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5597
		netdev->features |= NETIF_F_HW_VLAN_FILTER;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5598
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5599
	netdev->features |= NETIF_F_TSO;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5600
	netdev->features |= NETIF_F_TSO6;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5601
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5602
	netdev->vlan_features |= NETIF_F_TSO;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5603
	netdev->vlan_features |= NETIF_F_TSO6;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5604
	netdev->vlan_features |= NETIF_F_HW_CSUM;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5605
	netdev->vlan_features |= NETIF_F_SG;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5606
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5607
	if (pci_using_dac)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5608
		netdev->features |= NETIF_F_HIGHDMA;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5609
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5610
	if (e1000e_enable_mng_pass_thru(&adapter->hw))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5611
		adapter->flags |= FLAG_MNG_PT_ENABLED;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5612
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5613
	/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5614
	 * before reading the NVM, reset the controller to
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5615
	 * put the device in a known good starting state
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5616
	 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5617
	adapter->hw.mac.ops.reset_hw(&adapter->hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5618
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5619
	/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5620
	 * systems with ASPM and others may see the checksum fail on the first
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5621
	 * attempt. Let's give it a few tries
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5622
	 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5623
	for (i = 0;; i++) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5624
		if (e1000_validate_nvm_checksum(&adapter->hw) >= 0)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5625
			break;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5626
		if (i == 2) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5627
			e_err("The NVM Checksum Is Not Valid\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5628
			err = -EIO;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5629
			goto err_eeprom;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5630
		}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5631
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5632
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5633
	e1000_eeprom_checks(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5634
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5635
	/* copy the MAC address */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5636
	if (e1000e_read_mac_addr(&adapter->hw))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5637
		e_err("NVM Read Error while reading MAC address\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5638
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5639
	memcpy(netdev->dev_addr, adapter->hw.mac.addr, netdev->addr_len);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5640
	memcpy(netdev->perm_addr, adapter->hw.mac.addr, netdev->addr_len);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5641
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5642
	if (!is_valid_ether_addr(netdev->perm_addr)) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5643
		e_err("Invalid MAC Address: %pM\n", netdev->perm_addr);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5644
		err = -EIO;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5645
		goto err_eeprom;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5646
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5647
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5648
	init_timer(&adapter->watchdog_timer);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5649
	adapter->watchdog_timer.function = &e1000_watchdog;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5650
	adapter->watchdog_timer.data = (unsigned long) adapter;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5651
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5652
	init_timer(&adapter->phy_info_timer);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5653
	adapter->phy_info_timer.function = &e1000_update_phy_info;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5654
	adapter->phy_info_timer.data = (unsigned long) adapter;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5655
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5656
	INIT_WORK(&adapter->reset_task, e1000_reset_task);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5657
	INIT_WORK(&adapter->watchdog_task, e1000_watchdog_task);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5658
	INIT_WORK(&adapter->downshift_task, e1000e_downshift_workaround);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5659
	INIT_WORK(&adapter->update_phy_task, e1000e_update_phy_task);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5660
	INIT_WORK(&adapter->print_hang_task, e1000_print_hw_hang);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5661
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5662
	/* Initialize link parameters. User can change them with ethtool */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5663
	adapter->hw.mac.autoneg = 1;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5664
	adapter->fc_autoneg = 1;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5665
	adapter->hw.fc.requested_mode = e1000_fc_default;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5666
	adapter->hw.fc.current_mode = e1000_fc_default;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5667
	adapter->hw.phy.autoneg_advertised = 0x2f;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5668
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5669
	/* ring size defaults */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5670
	adapter->rx_ring->count = 256;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5671
	adapter->tx_ring->count = 256;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5672
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5673
	/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5674
	 * Initial Wake on LAN setting - If APM wake is enabled in
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5675
	 * the EEPROM, enable the ACPI Magic Packet filter
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5676
	 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5677
	if (adapter->flags & FLAG_APME_IN_WUC) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5678
		/* APME bit in EEPROM is mapped to WUC.APME */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5679
		eeprom_data = er32(WUC);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5680
		eeprom_apme_mask = E1000_WUC_APME;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5681
		if (eeprom_data & E1000_WUC_PHY_WAKE)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5682
			adapter->flags2 |= FLAG2_HAS_PHY_WAKEUP;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5683
	} else if (adapter->flags & FLAG_APME_IN_CTRL3) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5684
		if (adapter->flags & FLAG_APME_CHECK_PORT_B &&
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5685
		    (adapter->hw.bus.func == 1))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5686
			e1000_read_nvm(&adapter->hw,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5687
				NVM_INIT_CONTROL3_PORT_B, 1, &eeprom_data);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5688
		else
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5689
			e1000_read_nvm(&adapter->hw,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5690
				NVM_INIT_CONTROL3_PORT_A, 1, &eeprom_data);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5691
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5692
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5693
	/* fetch WoL from EEPROM */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5694
	if (eeprom_data & eeprom_apme_mask)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5695
		adapter->eeprom_wol |= E1000_WUFC_MAG;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5696
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5697
	/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5698
	 * now that we have the eeprom settings, apply the special cases
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5699
	 * where the eeprom may be wrong or the board simply won't support
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5700
	 * wake on lan on a particular port
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5701
	 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5702
	if (!(adapter->flags & FLAG_HAS_WOL))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5703
		adapter->eeprom_wol = 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5704
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5705
	/* initialize the wol settings based on the eeprom settings */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5706
	adapter->wol = adapter->eeprom_wol;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5707
	device_set_wakeup_enable(&adapter->pdev->dev, adapter->wol);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5708
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5709
	/* save off EEPROM version number */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5710
	e1000_read_nvm(&adapter->hw, 5, 1, &adapter->eeprom_vers);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5711
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5712
	/* reset the hardware with the new settings */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5713
	e1000e_reset(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5714
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5715
	/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5716
	 * If the controller has AMT, do not set DRV_LOAD until the interface
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5717
	 * is up.  For all other cases, let the f/w know that the h/w is now
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5718
	 * under the control of the driver.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5719
	 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5720
	if (!(adapter->flags & FLAG_HAS_AMT))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5721
		e1000_get_hw_control(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5722
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5723
	strcpy(netdev->name, "eth%d");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5724
	err = register_netdev(netdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5725
	if (err)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5726
		goto err_register;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5727
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5728
	/* carrier off reporting is important to ethtool even BEFORE open */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5729
	netif_carrier_off(netdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5730
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5731
	e1000_print_device_info(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5732
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5733
	if (pci_dev_run_wake(pdev)) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5734
		pm_runtime_set_active(&pdev->dev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5735
		pm_runtime_enable(&pdev->dev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5736
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5737
	pm_schedule_suspend(&pdev->dev, MSEC_PER_SEC);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5738
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5739
	return 0;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5740
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5741
err_register:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5742
	if (!(adapter->flags & FLAG_HAS_AMT))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5743
		e1000_release_hw_control(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5744
err_eeprom:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5745
	if (!e1000_check_reset_block(&adapter->hw))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5746
		e1000_phy_hw_reset(&adapter->hw);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5747
err_hw_init:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5748
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5749
	kfree(adapter->tx_ring);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5750
	kfree(adapter->rx_ring);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5751
err_sw_init:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5752
	if (adapter->hw.flash_address)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5753
		iounmap(adapter->hw.flash_address);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5754
	e1000e_reset_interrupt_capability(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5755
err_flashmap:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5756
	iounmap(adapter->hw.hw_addr);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5757
err_ioremap:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5758
	free_netdev(netdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5759
err_alloc_etherdev:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5760
	pci_release_selected_regions(pdev,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5761
	                             pci_select_bars(pdev, IORESOURCE_MEM));
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5762
err_pci_reg:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5763
err_dma:
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5764
	pci_disable_device(pdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5765
	return err;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5766
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5767
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5768
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5769
 * e1000_remove - Device Removal Routine
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5770
 * @pdev: PCI device information struct
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5771
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5772
 * e1000_remove is called by the PCI subsystem to alert the driver
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5773
 * that it should release a PCI device.  The could be caused by a
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5774
 * Hot-Plug event, or because the driver is going to be removed from
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5775
 * memory.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5776
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5777
static void __devexit e1000_remove(struct pci_dev *pdev)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5778
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5779
	struct net_device *netdev = pci_get_drvdata(pdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5780
	struct e1000_adapter *adapter = netdev_priv(netdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5781
	bool down = test_bit(__E1000_DOWN, &adapter->state);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5782
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5783
	pm_runtime_get_sync(&pdev->dev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5784
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5785
	/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5786
	 * flush_scheduled work may reschedule our watchdog task, so
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5787
	 * explicitly disable watchdog tasks from being rescheduled
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5788
	 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5789
	if (!down)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5790
		set_bit(__E1000_DOWN, &adapter->state);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5791
	del_timer_sync(&adapter->watchdog_timer);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5792
	del_timer_sync(&adapter->phy_info_timer);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5793
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5794
	cancel_work_sync(&adapter->reset_task);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5795
	cancel_work_sync(&adapter->watchdog_task);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5796
	cancel_work_sync(&adapter->downshift_task);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5797
	cancel_work_sync(&adapter->update_phy_task);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5798
	cancel_work_sync(&adapter->print_hang_task);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5799
	flush_scheduled_work();
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5800
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5801
	if (!(netdev->flags & IFF_UP))
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5802
		e1000_power_down_phy(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5803
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5804
	/* Don't lie to e1000_close() down the road. */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5805
	if (!down)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5806
		clear_bit(__E1000_DOWN, &adapter->state);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5807
	unregister_netdev(netdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5808
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5809
	if (pci_dev_run_wake(pdev)) {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5810
		pm_runtime_disable(&pdev->dev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5811
		pm_runtime_set_suspended(&pdev->dev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5812
	}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5813
	pm_runtime_put_noidle(&pdev->dev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5814
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5815
	/*
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5816
	 * Release control of h/w to f/w.  If f/w is AMT enabled, this
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5817
	 * would have already happened in close and is redundant.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5818
	 */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5819
	e1000_release_hw_control(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5820
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5821
	e1000e_reset_interrupt_capability(adapter);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5822
	kfree(adapter->tx_ring);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5823
	kfree(adapter->rx_ring);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5824
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5825
	iounmap(adapter->hw.hw_addr);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5826
	if (adapter->hw.flash_address)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5827
		iounmap(adapter->hw.flash_address);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5828
	pci_release_selected_regions(pdev,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5829
	                             pci_select_bars(pdev, IORESOURCE_MEM));
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5830
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5831
	free_netdev(netdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5832
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5833
	/* AER disable */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5834
	pci_disable_pcie_error_reporting(pdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5835
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5836
	pci_disable_device(pdev);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5837
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5838
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5839
/* PCI Error Recovery (ERS) */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5840
static struct pci_error_handlers e1000_err_handler = {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5841
	.error_detected = e1000_io_error_detected,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5842
	.slot_reset = e1000_io_slot_reset,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5843
	.resume = e1000_io_resume,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5844
};
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5845
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5846
static DEFINE_PCI_DEVICE_TABLE(e1000_pci_tbl) = {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5847
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82571EB_COPPER), board_82571 },
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5848
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82571EB_FIBER), board_82571 },
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5849
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82571EB_QUAD_COPPER), board_82571 },
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5850
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82571EB_QUAD_COPPER_LP), board_82571 },
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5851
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82571EB_QUAD_FIBER), board_82571 },
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5852
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82571EB_SERDES), board_82571 },
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5853
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82571EB_SERDES_DUAL), board_82571 },
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5854
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82571EB_SERDES_QUAD), board_82571 },
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5855
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82571PT_QUAD_COPPER), board_82571 },
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5856
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5857
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82572EI), board_82572 },
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5858
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82572EI_COPPER), board_82572 },
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5859
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82572EI_FIBER), board_82572 },
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5860
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82572EI_SERDES), board_82572 },
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5861
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5862
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82573E), board_82573 },
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5863
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82573E_IAMT), board_82573 },
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5864
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82573L), board_82573 },
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5865
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5866
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82574L), board_82574 },
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5867
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82574LA), board_82574 },
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5868
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82583V), board_82583 },
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5869
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5870
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_80003ES2LAN_COPPER_DPT),
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5871
	  board_80003es2lan },
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5872
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_80003ES2LAN_COPPER_SPT),
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5873
	  board_80003es2lan },
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5874
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_80003ES2LAN_SERDES_DPT),
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5875
	  board_80003es2lan },
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5876
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_80003ES2LAN_SERDES_SPT),
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5877
	  board_80003es2lan },
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5878
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5879
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH8_IFE), board_ich8lan },
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5880
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH8_IFE_G), board_ich8lan },
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5881
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH8_IFE_GT), board_ich8lan },
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5882
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH8_IGP_AMT), board_ich8lan },
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5883
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH8_IGP_C), board_ich8lan },
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5884
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH8_IGP_M), board_ich8lan },
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5885
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH8_IGP_M_AMT), board_ich8lan },
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5886
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH8_82567V_3), board_ich8lan },
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5887
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5888
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH9_IFE), board_ich9lan },
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5889
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH9_IFE_G), board_ich9lan },
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5890
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH9_IFE_GT), board_ich9lan },
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5891
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH9_IGP_AMT), board_ich9lan },
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5892
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH9_IGP_C), board_ich9lan },
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5893
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH9_BM), board_ich9lan },
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5894
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH9_IGP_M), board_ich9lan },
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5895
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH9_IGP_M_AMT), board_ich9lan },
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5896
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH9_IGP_M_V), board_ich9lan },
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5897
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5898
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH10_R_BM_LM), board_ich9lan },
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5899
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH10_R_BM_LF), board_ich9lan },
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5900
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH10_R_BM_V), board_ich9lan },
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5901
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5902
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH10_D_BM_LM), board_ich10lan },
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5903
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH10_D_BM_LF), board_ich10lan },
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5904
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH10_D_BM_V), board_ich10lan },
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5905
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5906
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH_M_HV_LM), board_pchlan },
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5907
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH_M_HV_LC), board_pchlan },
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5908
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH_D_HV_DM), board_pchlan },
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5909
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH_D_HV_DC), board_pchlan },
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5910
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5911
	{ }	/* terminate list */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5912
};
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5913
MODULE_DEVICE_TABLE(pci, e1000_pci_tbl);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5914
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5915
#ifdef CONFIG_PM_OPS
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5916
static const struct dev_pm_ops e1000_pm_ops = {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5917
	SET_SYSTEM_SLEEP_PM_OPS(e1000_suspend, e1000_resume)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5918
	SET_RUNTIME_PM_OPS(e1000_runtime_suspend,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5919
				e1000_runtime_resume, e1000_idle)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5920
};
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5921
#endif
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5922
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5923
/* PCI Device API Driver */
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5924
static struct pci_driver e1000_driver = {
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5925
	.name     = e1000e_driver_name,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5926
	.id_table = e1000_pci_tbl,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5927
	.probe    = e1000_probe,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5928
	.remove   = __devexit_p(e1000_remove),
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5929
#ifdef CONFIG_PM_OPS
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5930
	.driver.pm = &e1000_pm_ops,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5931
#endif
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5932
	.shutdown = e1000_shutdown,
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5933
	.err_handler = &e1000_err_handler
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5934
};
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5935
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5936
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5937
 * e1000_init_module - Driver Registration Routine
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5938
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5939
 * e1000_init_module is the first routine called when the driver is
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5940
 * loaded. All it does is register with the PCI subsystem.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5941
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5942
static int __init e1000_init_module(void)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5943
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5944
	int ret;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5945
	pr_info("Intel(R) PRO/1000 Network Driver - %s\n",
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5946
		e1000e_driver_version);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5947
	pr_info("Copyright (c) 1999 - 2009 Intel Corporation.\n");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5948
	ret = pci_register_driver(&e1000_driver);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5949
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5950
	return ret;
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5951
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5952
module_init(e1000_init_module);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5953
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5954
/**
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5955
 * e1000_exit_module - Driver Exit Cleanup Routine
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5956
 *
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5957
 * e1000_exit_module is called just before the driver is removed
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5958
 * from memory.
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5959
 **/
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5960
static void __exit e1000_exit_module(void)
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5961
{
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5962
	pci_unregister_driver(&e1000_driver);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5963
}
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5964
module_exit(e1000_exit_module);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5965
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5966
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5967
MODULE_AUTHOR("Intel Corporation, <linux.nics@intel.com>");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5968
MODULE_DESCRIPTION("Intel(R) PRO/1000 Network Driver");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5969
MODULE_LICENSE("GPL");
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5970
MODULE_VERSION(DRV_VERSION);
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5971
8ebecea534d3 Added e1000e driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5972
/* e1000_main.c */