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

revert "limit rx processing to one frame per poll", which caused etherlab
frame timeouts in setups with more than one frame per cycle.
2217
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     1
/*******************************************************************************
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     2
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     3
  Intel PRO/1000 Linux driver
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     4
  Copyright(c) 1999 - 2008 Intel Corporation.
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     5
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     6
  This program is free software; you can redistribute it and/or modify it
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     7
  under the terms and conditions of the GNU General Public License,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     8
  version 2, as published by the Free Software Foundation.
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     9
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    10
  This program is distributed in the hope it will be useful, but WITHOUT
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    11
  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    12
  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    13
  more details.
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    14
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    15
  You should have received a copy of the GNU General Public License along with
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    16
  this program; if not, write to the Free Software Foundation, Inc.,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    17
  51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    18
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    19
  The full GNU General Public License is included in this distribution in
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    20
  the file called "COPYING".
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    21
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    22
  Contact Information:
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    23
  Linux NICS <linux.nics@intel.com>
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    24
  e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    25
  Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    26
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    27
*******************************************************************************/
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    28
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    29
#include <linux/module.h>
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    30
#include <linux/types.h>
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    31
#include <linux/init.h>
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    32
#include <linux/pci.h>
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    33
#include <linux/vmalloc.h>
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    34
#include <linux/pagemap.h>
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    35
#include <linux/delay.h>
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    36
#include <linux/netdevice.h>
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    37
#include <linux/tcp.h>
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    38
#include <linux/ipv6.h>
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    39
#include <net/checksum.h>
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    40
#include <net/ip6_checksum.h>
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    41
#include <linux/mii.h>
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    42
#include <linux/ethtool.h>
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    43
#include <linux/if_vlan.h>
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    44
#include <linux/cpu.h>
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    45
#include <linux/smp.h>
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    46
#include <linux/pm_qos_params.h>
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    47
#include <linux/aer.h>
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    48
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    49
#include "e1000.h"
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    50
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    51
#define DRV_VERSION "1.0.2-k2"
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    52
char e1000e_driver_name[] = "e1000e";
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    53
const char e1000e_driver_version[] = DRV_VERSION;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    54
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    55
static const struct e1000_info *e1000_info_tbl[] = {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    56
	[board_82571]		= &e1000_82571_info,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    57
	[board_82572]		= &e1000_82572_info,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    58
	[board_82573]		= &e1000_82573_info,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    59
	[board_82574]		= &e1000_82574_info,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    60
	[board_82583]		= &e1000_82583_info,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    61
	[board_80003es2lan]	= &e1000_es2_info,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    62
	[board_ich8lan]		= &e1000_ich8_info,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    63
	[board_ich9lan]		= &e1000_ich9_info,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    64
	[board_ich10lan]	= &e1000_ich10_info,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    65
	[board_pchlan]		= &e1000_pch_info,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    66
};
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    67
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    68
#ifdef DEBUG
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    69
/**
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    70
 * e1000_get_hw_dev_name - return device name string
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    71
 * used by hardware layer to print debugging information
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    72
 **/
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    73
char *e1000e_get_hw_dev_name(struct e1000_hw *hw)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    74
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    75
	return hw->adapter->netdev->name;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    76
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    77
#endif
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    78
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    79
/**
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    80
 * e1000_desc_unused - calculate if we have unused descriptors
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    81
 **/
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    82
static int e1000_desc_unused(struct e1000_ring *ring)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    83
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    84
	if (ring->next_to_clean > ring->next_to_use)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    85
		return ring->next_to_clean - ring->next_to_use - 1;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    86
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    87
	return ring->count + ring->next_to_clean - ring->next_to_use - 1;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    88
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    89
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    90
/**
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    91
 * e1000_receive_skb - helper function to handle Rx indications
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    92
 * @adapter: board private structure
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    93
 * @status: descriptor status field as written by hardware
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    94
 * @vlan: descriptor vlan field as written by hardware (no le/be conversion)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    95
 * @skb: pointer to sk_buff to be indicated to stack
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    96
 **/
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    97
static void e1000_receive_skb(struct e1000_adapter *adapter,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    98
			      struct net_device *netdev,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    99
			      struct sk_buff *skb,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   100
			      u8 status, __le16 vlan)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   101
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   102
	skb->protocol = eth_type_trans(skb, netdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   103
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   104
	if (adapter->vlgrp && (status & E1000_RXD_STAT_VP))
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   105
		vlan_gro_receive(&adapter->napi, adapter->vlgrp,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   106
				 le16_to_cpu(vlan), skb);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   107
	else
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   108
		napi_gro_receive(&adapter->napi, skb);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   109
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   110
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   111
/**
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   112
 * e1000_rx_checksum - Receive Checksum Offload for 82543
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   113
 * @adapter:     board private structure
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   114
 * @status_err:  receive descriptor status and error fields
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   115
 * @csum:	receive descriptor csum field
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   116
 * @sk_buff:     socket buffer with received data
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   117
 **/
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   118
static void e1000_rx_checksum(struct e1000_adapter *adapter, u32 status_err,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   119
			      u32 csum, struct sk_buff *skb)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   120
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   121
	u16 status = (u16)status_err;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   122
	u8 errors = (u8)(status_err >> 24);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   123
	skb->ip_summed = CHECKSUM_NONE;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   124
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   125
	/* Ignore Checksum bit is set */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   126
	if (status & E1000_RXD_STAT_IXSM)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   127
		return;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   128
	/* TCP/UDP checksum error bit is set */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   129
	if (errors & E1000_RXD_ERR_TCPE) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   130
		/* let the stack verify checksum errors */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   131
		adapter->hw_csum_err++;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   132
		return;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   133
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   134
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   135
	/* TCP/UDP Checksum has not been calculated */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   136
	if (!(status & (E1000_RXD_STAT_TCPCS | E1000_RXD_STAT_UDPCS)))
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   137
		return;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   138
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   139
	/* It must be a TCP or UDP packet with a valid checksum */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   140
	if (status & E1000_RXD_STAT_TCPCS) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   141
		/* TCP checksum is good */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   142
		skb->ip_summed = CHECKSUM_UNNECESSARY;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   143
	} else {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   144
		/*
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   145
		 * IP fragment with UDP payload
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   146
		 * Hardware complements the payload checksum, so we undo it
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   147
		 * and then put the value in host order for further stack use.
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   148
		 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   149
		__sum16 sum = (__force __sum16)htons(csum);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   150
		skb->csum = csum_unfold(~sum);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   151
		skb->ip_summed = CHECKSUM_COMPLETE;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   152
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   153
	adapter->hw_csum_good++;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   154
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   155
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   156
/**
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   157
 * e1000_alloc_rx_buffers - Replace used receive buffers; legacy & extended
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   158
 * @adapter: address of board private structure
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   159
 **/
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   160
static void e1000_alloc_rx_buffers(struct e1000_adapter *adapter,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   161
				   int cleaned_count)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   162
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   163
	struct net_device *netdev = adapter->netdev;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   164
	struct pci_dev *pdev = adapter->pdev;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   165
	struct e1000_ring *rx_ring = adapter->rx_ring;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   166
	struct e1000_rx_desc *rx_desc;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   167
	struct e1000_buffer *buffer_info;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   168
	struct sk_buff *skb;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   169
	unsigned int i;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   170
	unsigned int bufsz = adapter->rx_buffer_len + NET_IP_ALIGN;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   171
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   172
	i = rx_ring->next_to_use;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   173
	buffer_info = &rx_ring->buffer_info[i];
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   174
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   175
	while (cleaned_count--) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   176
		skb = buffer_info->skb;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   177
		if (skb) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   178
			skb_trim(skb, 0);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   179
			goto map_skb;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   180
		}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   181
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   182
		skb = netdev_alloc_skb(netdev, bufsz);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   183
		if (!skb) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   184
			/* Better luck next round */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   185
			adapter->alloc_rx_buff_failed++;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   186
			break;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   187
		}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   188
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   189
		/*
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   190
		 * Make buffer alignment 2 beyond a 16 byte boundary
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   191
		 * this will result in a 16 byte aligned IP header after
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   192
		 * the 14 byte MAC header is removed
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   193
		 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   194
		skb_reserve(skb, NET_IP_ALIGN);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   195
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   196
		buffer_info->skb = skb;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   197
map_skb:
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   198
		buffer_info->dma = pci_map_single(pdev, skb->data,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   199
						  adapter->rx_buffer_len,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   200
						  PCI_DMA_FROMDEVICE);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   201
		if (pci_dma_mapping_error(pdev, buffer_info->dma)) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   202
			dev_err(&pdev->dev, "RX DMA map failed\n");
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   203
			adapter->rx_dma_failed++;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   204
			break;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   205
		}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   206
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   207
		rx_desc = E1000_RX_DESC(*rx_ring, i);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   208
		rx_desc->buffer_addr = cpu_to_le64(buffer_info->dma);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   209
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   210
		i++;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   211
		if (i == rx_ring->count)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   212
			i = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   213
		buffer_info = &rx_ring->buffer_info[i];
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   214
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   215
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   216
	if (rx_ring->next_to_use != i) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   217
		rx_ring->next_to_use = i;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   218
		if (i-- == 0)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   219
			i = (rx_ring->count - 1);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   220
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   221
		/*
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   222
		 * Force memory writes to complete before letting h/w
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   223
		 * know there are new descriptors to fetch.  (Only
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   224
		 * applicable for weak-ordered memory model archs,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   225
		 * such as IA-64).
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   226
		 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   227
		wmb();
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   228
		writel(i, adapter->hw.hw_addr + rx_ring->tail);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   229
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   230
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   231
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   232
/**
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   233
 * e1000_alloc_rx_buffers_ps - Replace used receive buffers; packet split
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   234
 * @adapter: address of board private structure
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   235
 **/
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   236
static void e1000_alloc_rx_buffers_ps(struct e1000_adapter *adapter,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   237
				      int cleaned_count)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   238
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   239
	struct net_device *netdev = adapter->netdev;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   240
	struct pci_dev *pdev = adapter->pdev;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   241
	union e1000_rx_desc_packet_split *rx_desc;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   242
	struct e1000_ring *rx_ring = adapter->rx_ring;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   243
	struct e1000_buffer *buffer_info;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   244
	struct e1000_ps_page *ps_page;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   245
	struct sk_buff *skb;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   246
	unsigned int i, j;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   247
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   248
	i = rx_ring->next_to_use;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   249
	buffer_info = &rx_ring->buffer_info[i];
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   250
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   251
	while (cleaned_count--) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   252
		rx_desc = E1000_RX_DESC_PS(*rx_ring, i);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   253
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   254
		for (j = 0; j < PS_PAGE_BUFFERS; j++) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   255
			ps_page = &buffer_info->ps_pages[j];
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   256
			if (j >= adapter->rx_ps_pages) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   257
				/* all unused desc entries get hw null ptr */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   258
				rx_desc->read.buffer_addr[j+1] = ~cpu_to_le64(0);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   259
				continue;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   260
			}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   261
			if (!ps_page->page) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   262
				ps_page->page = alloc_page(GFP_ATOMIC);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   263
				if (!ps_page->page) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   264
					adapter->alloc_rx_buff_failed++;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   265
					goto no_buffers;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   266
				}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   267
				ps_page->dma = pci_map_page(pdev,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   268
						   ps_page->page,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   269
						   0, PAGE_SIZE,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   270
						   PCI_DMA_FROMDEVICE);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   271
				if (pci_dma_mapping_error(pdev, ps_page->dma)) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   272
					dev_err(&adapter->pdev->dev,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   273
					  "RX DMA page map failed\n");
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   274
					adapter->rx_dma_failed++;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   275
					goto no_buffers;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   276
				}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   277
			}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   278
			/*
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   279
			 * Refresh the desc even if buffer_addrs
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   280
			 * didn't change because each write-back
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   281
			 * erases this info.
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   282
			 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   283
			rx_desc->read.buffer_addr[j+1] =
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   284
			     cpu_to_le64(ps_page->dma);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   285
		}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   286
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   287
		skb = netdev_alloc_skb(netdev,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   288
				       adapter->rx_ps_bsize0 + NET_IP_ALIGN);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   289
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   290
		if (!skb) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   291
			adapter->alloc_rx_buff_failed++;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   292
			break;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   293
		}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   294
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   295
		/*
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   296
		 * Make buffer alignment 2 beyond a 16 byte boundary
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   297
		 * this will result in a 16 byte aligned IP header after
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   298
		 * the 14 byte MAC header is removed
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   299
		 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   300
		skb_reserve(skb, NET_IP_ALIGN);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   301
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   302
		buffer_info->skb = skb;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   303
		buffer_info->dma = pci_map_single(pdev, skb->data,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   304
						  adapter->rx_ps_bsize0,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   305
						  PCI_DMA_FROMDEVICE);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   306
		if (pci_dma_mapping_error(pdev, buffer_info->dma)) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   307
			dev_err(&pdev->dev, "RX DMA map failed\n");
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   308
			adapter->rx_dma_failed++;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   309
			/* cleanup skb */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   310
			dev_kfree_skb_any(skb);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   311
			buffer_info->skb = NULL;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   312
			break;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   313
		}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   314
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   315
		rx_desc->read.buffer_addr[0] = cpu_to_le64(buffer_info->dma);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   316
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   317
		i++;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   318
		if (i == rx_ring->count)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   319
			i = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   320
		buffer_info = &rx_ring->buffer_info[i];
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   321
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   322
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   323
no_buffers:
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   324
	if (rx_ring->next_to_use != i) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   325
		rx_ring->next_to_use = i;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   326
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   327
		if (!(i--))
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   328
			i = (rx_ring->count - 1);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   329
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   330
		/*
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   331
		 * Force memory writes to complete before letting h/w
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   332
		 * know there are new descriptors to fetch.  (Only
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   333
		 * applicable for weak-ordered memory model archs,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   334
		 * such as IA-64).
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   335
		 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   336
		wmb();
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   337
		/*
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   338
		 * Hardware increments by 16 bytes, but packet split
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   339
		 * descriptors are 32 bytes...so we increment tail
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   340
		 * twice as much.
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   341
		 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   342
		writel(i<<1, adapter->hw.hw_addr + rx_ring->tail);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   343
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   344
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   345
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   346
/**
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   347
 * e1000_alloc_jumbo_rx_buffers - Replace used jumbo receive buffers
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   348
 * @adapter: address of board private structure
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   349
 * @cleaned_count: number of buffers to allocate this pass
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   350
 **/
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   351
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   352
static void e1000_alloc_jumbo_rx_buffers(struct e1000_adapter *adapter,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   353
                                         int cleaned_count)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   354
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   355
	struct net_device *netdev = adapter->netdev;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   356
	struct pci_dev *pdev = adapter->pdev;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   357
	struct e1000_rx_desc *rx_desc;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   358
	struct e1000_ring *rx_ring = adapter->rx_ring;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   359
	struct e1000_buffer *buffer_info;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   360
	struct sk_buff *skb;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   361
	unsigned int i;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   362
	unsigned int bufsz = 256 -
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   363
	                     16 /* for skb_reserve */ -
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   364
	                     NET_IP_ALIGN;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   365
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   366
	i = rx_ring->next_to_use;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   367
	buffer_info = &rx_ring->buffer_info[i];
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   368
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   369
	while (cleaned_count--) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   370
		skb = buffer_info->skb;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   371
		if (skb) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   372
			skb_trim(skb, 0);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   373
			goto check_page;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   374
		}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   375
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   376
		skb = netdev_alloc_skb(netdev, bufsz);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   377
		if (unlikely(!skb)) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   378
			/* Better luck next round */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   379
			adapter->alloc_rx_buff_failed++;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   380
			break;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   381
		}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   382
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   383
		/* Make buffer alignment 2 beyond a 16 byte boundary
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   384
		 * this will result in a 16 byte aligned IP header after
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   385
		 * the 14 byte MAC header is removed
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   386
		 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   387
		skb_reserve(skb, NET_IP_ALIGN);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   388
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   389
		buffer_info->skb = skb;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   390
check_page:
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   391
		/* allocate a new page if necessary */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   392
		if (!buffer_info->page) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   393
			buffer_info->page = alloc_page(GFP_ATOMIC);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   394
			if (unlikely(!buffer_info->page)) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   395
				adapter->alloc_rx_buff_failed++;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   396
				break;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   397
			}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   398
		}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   399
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   400
		if (!buffer_info->dma)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   401
			buffer_info->dma = pci_map_page(pdev,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   402
			                                buffer_info->page, 0,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   403
			                                PAGE_SIZE,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   404
			                                PCI_DMA_FROMDEVICE);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   405
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   406
		rx_desc = E1000_RX_DESC(*rx_ring, i);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   407
		rx_desc->buffer_addr = cpu_to_le64(buffer_info->dma);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   408
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   409
		if (unlikely(++i == rx_ring->count))
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   410
			i = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   411
		buffer_info = &rx_ring->buffer_info[i];
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   412
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   413
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   414
	if (likely(rx_ring->next_to_use != i)) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   415
		rx_ring->next_to_use = i;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   416
		if (unlikely(i-- == 0))
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   417
			i = (rx_ring->count - 1);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   418
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   419
		/* Force memory writes to complete before letting h/w
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   420
		 * know there are new descriptors to fetch.  (Only
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   421
		 * applicable for weak-ordered memory model archs,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   422
		 * such as IA-64). */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   423
		wmb();
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   424
		writel(i, adapter->hw.hw_addr + rx_ring->tail);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   425
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   426
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   427
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   428
/**
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   429
 * e1000_clean_rx_irq - Send received data up the network stack; legacy
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   430
 * @adapter: board private structure
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   431
 *
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   432
 * the return value indicates whether actual cleaning was done, there
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   433
 * is no guarantee that everything was cleaned
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   434
 **/
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   435
static bool e1000_clean_rx_irq(struct e1000_adapter *adapter,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   436
			       int *work_done, int work_to_do)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   437
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   438
	struct net_device *netdev = adapter->netdev;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   439
	struct pci_dev *pdev = adapter->pdev;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   440
	struct e1000_ring *rx_ring = adapter->rx_ring;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   441
	struct e1000_rx_desc *rx_desc, *next_rxd;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   442
	struct e1000_buffer *buffer_info, *next_buffer;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   443
	u32 length;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   444
	unsigned int i;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   445
	int cleaned_count = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   446
	bool cleaned = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   447
	unsigned int total_rx_bytes = 0, total_rx_packets = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   448
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   449
	i = rx_ring->next_to_clean;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   450
	rx_desc = E1000_RX_DESC(*rx_ring, i);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   451
	buffer_info = &rx_ring->buffer_info[i];
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   452
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   453
	while (rx_desc->status & E1000_RXD_STAT_DD) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   454
		struct sk_buff *skb;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   455
		u8 status;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   456
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   457
		if (*work_done >= work_to_do)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   458
			break;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   459
		(*work_done)++;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   460
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   461
		status = rx_desc->status;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   462
		skb = buffer_info->skb;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   463
		buffer_info->skb = NULL;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   464
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   465
		prefetch(skb->data - NET_IP_ALIGN);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   466
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   467
		i++;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   468
		if (i == rx_ring->count)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   469
			i = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   470
		next_rxd = E1000_RX_DESC(*rx_ring, i);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   471
		prefetch(next_rxd);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   472
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   473
		next_buffer = &rx_ring->buffer_info[i];
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   474
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   475
		cleaned = 1;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   476
		cleaned_count++;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   477
		pci_unmap_single(pdev,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   478
				 buffer_info->dma,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   479
				 adapter->rx_buffer_len,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   480
				 PCI_DMA_FROMDEVICE);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   481
		buffer_info->dma = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   482
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   483
		length = le16_to_cpu(rx_desc->length);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   484
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   485
		/*
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   486
		 * !EOP means multiple descriptors were used to store a single
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   487
		 * packet, if that's the case we need to toss it.  In fact, we
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   488
		 * need to toss every packet with the EOP bit clear and the
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   489
		 * next frame that _does_ have the EOP bit set, as it is by
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   490
		 * definition only a frame fragment
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   491
		 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   492
		if (unlikely(!(status & E1000_RXD_STAT_EOP)))
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   493
			adapter->flags2 |= FLAG2_IS_DISCARDING;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   494
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   495
		if (adapter->flags2 & FLAG2_IS_DISCARDING) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   496
			/* All receives must fit into a single buffer */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   497
			e_dbg("%s: Receive packet consumed multiple buffers\n",
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   498
			      netdev->name);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   499
			/* recycle */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   500
			buffer_info->skb = skb;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   501
			if (status & E1000_RXD_STAT_EOP)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   502
				adapter->flags2 &= ~FLAG2_IS_DISCARDING;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   503
			goto next_desc;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   504
		}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   505
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   506
		if (rx_desc->errors & E1000_RXD_ERR_FRAME_ERR_MASK) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   507
			/* recycle */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   508
			buffer_info->skb = skb;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   509
			goto next_desc;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   510
		}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   511
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   512
		/* adjust length to remove Ethernet CRC */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   513
		if (!(adapter->flags2 & FLAG2_CRC_STRIPPING))
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   514
			length -= 4;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   515
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   516
		total_rx_bytes += length;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   517
		total_rx_packets++;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   518
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   519
		/*
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   520
		 * code added for copybreak, this should improve
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   521
		 * performance for small packets with large amounts
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   522
		 * of reassembly being done in the stack
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   523
		 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   524
		if (length < copybreak) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   525
			struct sk_buff *new_skb =
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   526
			    netdev_alloc_skb(netdev, length + NET_IP_ALIGN);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   527
			if (new_skb) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   528
				skb_reserve(new_skb, NET_IP_ALIGN);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   529
				skb_copy_to_linear_data_offset(new_skb,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   530
							       -NET_IP_ALIGN,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   531
							       (skb->data -
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   532
								NET_IP_ALIGN),
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   533
							       (length +
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   534
								NET_IP_ALIGN));
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   535
				/* save the skb in buffer_info as good */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   536
				buffer_info->skb = skb;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   537
				skb = new_skb;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   538
			}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   539
			/* else just continue with the old one */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   540
		}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   541
		/* end copybreak code */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   542
		skb_put(skb, length);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   543
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   544
		/* Receive Checksum Offload */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   545
		e1000_rx_checksum(adapter,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   546
				  (u32)(status) |
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   547
				  ((u32)(rx_desc->errors) << 24),
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   548
				  le16_to_cpu(rx_desc->csum), skb);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   549
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   550
		e1000_receive_skb(adapter, netdev, skb,status,rx_desc->special);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   551
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   552
next_desc:
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   553
		rx_desc->status = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   554
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   555
		/* return some buffers to hardware, one at a time is too slow */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   556
		if (cleaned_count >= E1000_RX_BUFFER_WRITE) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   557
			adapter->alloc_rx_buf(adapter, cleaned_count);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   558
			cleaned_count = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   559
		}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   560
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   561
		/* use prefetched values */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   562
		rx_desc = next_rxd;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   563
		buffer_info = next_buffer;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   564
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   565
	rx_ring->next_to_clean = i;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   566
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   567
	cleaned_count = e1000_desc_unused(rx_ring);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   568
	if (cleaned_count)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   569
		adapter->alloc_rx_buf(adapter, cleaned_count);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   570
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   571
	adapter->total_rx_bytes += total_rx_bytes;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   572
	adapter->total_rx_packets += total_rx_packets;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   573
	adapter->net_stats.rx_bytes += total_rx_bytes;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   574
	adapter->net_stats.rx_packets += total_rx_packets;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   575
	return cleaned;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   576
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   577
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   578
static void e1000_put_txbuf(struct e1000_adapter *adapter,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   579
			     struct e1000_buffer *buffer_info)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   580
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   581
	buffer_info->dma = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   582
	if (buffer_info->skb) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   583
		skb_dma_unmap(&adapter->pdev->dev, buffer_info->skb,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   584
		              DMA_TO_DEVICE);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   585
		dev_kfree_skb_any(buffer_info->skb);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   586
		buffer_info->skb = NULL;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   587
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   588
	buffer_info->time_stamp = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   589
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   590
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   591
static void e1000_print_tx_hang(struct e1000_adapter *adapter)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   592
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   593
	struct e1000_ring *tx_ring = adapter->tx_ring;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   594
	unsigned int i = tx_ring->next_to_clean;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   595
	unsigned int eop = tx_ring->buffer_info[i].next_to_watch;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   596
	struct e1000_tx_desc *eop_desc = E1000_TX_DESC(*tx_ring, eop);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   597
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   598
	/* detected Tx unit hang */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   599
	e_err("Detected Tx Unit Hang:\n"
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   600
	      "  TDH                  <%x>\n"
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   601
	      "  TDT                  <%x>\n"
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   602
	      "  next_to_use          <%x>\n"
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   603
	      "  next_to_clean        <%x>\n"
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   604
	      "buffer_info[next_to_clean]:\n"
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   605
	      "  time_stamp           <%lx>\n"
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   606
	      "  next_to_watch        <%x>\n"
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   607
	      "  jiffies              <%lx>\n"
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   608
	      "  next_to_watch.status <%x>\n",
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   609
	      readl(adapter->hw.hw_addr + tx_ring->head),
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   610
	      readl(adapter->hw.hw_addr + tx_ring->tail),
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   611
	      tx_ring->next_to_use,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   612
	      tx_ring->next_to_clean,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   613
	      tx_ring->buffer_info[eop].time_stamp,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   614
	      eop,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   615
	      jiffies,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   616
	      eop_desc->upper.fields.status);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   617
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   618
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   619
/**
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   620
 * e1000_clean_tx_irq - Reclaim resources after transmit completes
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   621
 * @adapter: board private structure
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   622
 *
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   623
 * the return value indicates whether actual cleaning was done, there
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   624
 * is no guarantee that everything was cleaned
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   625
 **/
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   626
static bool e1000_clean_tx_irq(struct e1000_adapter *adapter)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   627
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   628
	struct net_device *netdev = adapter->netdev;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   629
	struct e1000_hw *hw = &adapter->hw;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   630
	struct e1000_ring *tx_ring = adapter->tx_ring;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   631
	struct e1000_tx_desc *tx_desc, *eop_desc;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   632
	struct e1000_buffer *buffer_info;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   633
	unsigned int i, eop;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   634
	unsigned int count = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   635
	unsigned int total_tx_bytes = 0, total_tx_packets = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   636
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   637
	i = tx_ring->next_to_clean;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   638
	eop = tx_ring->buffer_info[i].next_to_watch;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   639
	eop_desc = E1000_TX_DESC(*tx_ring, eop);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   640
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   641
	while ((eop_desc->upper.data & cpu_to_le32(E1000_TXD_STAT_DD)) &&
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   642
	       (count < tx_ring->count)) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   643
		bool cleaned = false;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   644
		for (; !cleaned; count++) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   645
			tx_desc = E1000_TX_DESC(*tx_ring, i);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   646
			buffer_info = &tx_ring->buffer_info[i];
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   647
			cleaned = (i == eop);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   648
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   649
			if (cleaned) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   650
				struct sk_buff *skb = buffer_info->skb;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   651
				unsigned int segs, bytecount;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   652
				segs = skb_shinfo(skb)->gso_segs ?: 1;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   653
				/* multiply data chunks by size of headers */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   654
				bytecount = ((segs - 1) * skb_headlen(skb)) +
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   655
					    skb->len;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   656
				total_tx_packets += segs;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   657
				total_tx_bytes += bytecount;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   658
			}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   659
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   660
			e1000_put_txbuf(adapter, buffer_info);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   661
			tx_desc->upper.data = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   662
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   663
			i++;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   664
			if (i == tx_ring->count)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   665
				i = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   666
		}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   667
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   668
		eop = tx_ring->buffer_info[i].next_to_watch;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   669
		eop_desc = E1000_TX_DESC(*tx_ring, eop);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   670
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   671
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   672
	tx_ring->next_to_clean = i;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   673
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   674
#define TX_WAKE_THRESHOLD 32
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   675
	if (count && netif_carrier_ok(netdev) &&
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   676
	    e1000_desc_unused(tx_ring) >= TX_WAKE_THRESHOLD) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   677
		/* Make sure that anybody stopping the queue after this
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   678
		 * sees the new next_to_clean.
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   679
		 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   680
		smp_mb();
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   681
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   682
		if (netif_queue_stopped(netdev) &&
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   683
		    !(test_bit(__E1000_DOWN, &adapter->state))) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   684
			netif_wake_queue(netdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   685
			++adapter->restart_queue;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   686
		}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   687
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   688
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   689
	if (adapter->detect_tx_hung) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   690
		/* Detect a transmit hang in hardware, this serializes the
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   691
		 * check with the clearing of time_stamp and movement of i */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   692
		adapter->detect_tx_hung = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   693
		if (tx_ring->buffer_info[i].time_stamp &&
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   694
		    time_after(jiffies, tx_ring->buffer_info[i].time_stamp
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   695
			       + (adapter->tx_timeout_factor * HZ))
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   696
		    && !(er32(STATUS) & E1000_STATUS_TXOFF)) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   697
			e1000_print_tx_hang(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   698
			netif_stop_queue(netdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   699
		}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   700
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   701
	adapter->total_tx_bytes += total_tx_bytes;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   702
	adapter->total_tx_packets += total_tx_packets;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   703
	adapter->net_stats.tx_bytes += total_tx_bytes;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   704
	adapter->net_stats.tx_packets += total_tx_packets;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   705
	return (count < tx_ring->count);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   706
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   707
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   708
/**
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   709
 * e1000_clean_rx_irq_ps - Send received data up the network stack; packet split
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   710
 * @adapter: board private structure
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   711
 *
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   712
 * the return value indicates whether actual cleaning was done, there
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   713
 * is no guarantee that everything was cleaned
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   714
 **/
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   715
static bool e1000_clean_rx_irq_ps(struct e1000_adapter *adapter,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   716
				  int *work_done, int work_to_do)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   717
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   718
	union e1000_rx_desc_packet_split *rx_desc, *next_rxd;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   719
	struct net_device *netdev = adapter->netdev;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   720
	struct pci_dev *pdev = adapter->pdev;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   721
	struct e1000_ring *rx_ring = adapter->rx_ring;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   722
	struct e1000_buffer *buffer_info, *next_buffer;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   723
	struct e1000_ps_page *ps_page;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   724
	struct sk_buff *skb;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   725
	unsigned int i, j;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   726
	u32 length, staterr;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   727
	int cleaned_count = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   728
	bool cleaned = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   729
	unsigned int total_rx_bytes = 0, total_rx_packets = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   730
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   731
	i = rx_ring->next_to_clean;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   732
	rx_desc = E1000_RX_DESC_PS(*rx_ring, i);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   733
	staterr = le32_to_cpu(rx_desc->wb.middle.status_error);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   734
	buffer_info = &rx_ring->buffer_info[i];
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   735
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   736
	while (staterr & E1000_RXD_STAT_DD) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   737
		if (*work_done >= work_to_do)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   738
			break;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   739
		(*work_done)++;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   740
		skb = buffer_info->skb;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   741
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   742
		/* in the packet split case this is header only */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   743
		prefetch(skb->data - NET_IP_ALIGN);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   744
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   745
		i++;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   746
		if (i == rx_ring->count)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   747
			i = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   748
		next_rxd = E1000_RX_DESC_PS(*rx_ring, i);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   749
		prefetch(next_rxd);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   750
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   751
		next_buffer = &rx_ring->buffer_info[i];
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   752
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   753
		cleaned = 1;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   754
		cleaned_count++;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   755
		pci_unmap_single(pdev, buffer_info->dma,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   756
				 adapter->rx_ps_bsize0,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   757
				 PCI_DMA_FROMDEVICE);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   758
		buffer_info->dma = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   759
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   760
		/* see !EOP comment in other rx routine */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   761
		if (!(staterr & E1000_RXD_STAT_EOP))
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   762
			adapter->flags2 |= FLAG2_IS_DISCARDING;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   763
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   764
		if (adapter->flags2 & FLAG2_IS_DISCARDING) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   765
			e_dbg("%s: Packet Split buffers didn't pick up the "
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   766
			      "full packet\n", netdev->name);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   767
			dev_kfree_skb_irq(skb);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   768
			if (staterr & E1000_RXD_STAT_EOP)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   769
				adapter->flags2 &= ~FLAG2_IS_DISCARDING;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   770
			goto next_desc;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   771
		}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   772
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   773
		if (staterr & E1000_RXDEXT_ERR_FRAME_ERR_MASK) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   774
			dev_kfree_skb_irq(skb);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   775
			goto next_desc;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   776
		}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   777
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   778
		length = le16_to_cpu(rx_desc->wb.middle.length0);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   779
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   780
		if (!length) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   781
			e_dbg("%s: Last part of the packet spanning multiple "
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   782
			      "descriptors\n", netdev->name);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   783
			dev_kfree_skb_irq(skb);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   784
			goto next_desc;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   785
		}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   786
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   787
		/* Good Receive */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   788
		skb_put(skb, length);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   789
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   790
		{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   791
		/*
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   792
		 * this looks ugly, but it seems compiler issues make it
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   793
		 * more efficient than reusing j
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   794
		 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   795
		int l1 = le16_to_cpu(rx_desc->wb.upper.length[0]);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   796
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   797
		/*
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   798
		 * page alloc/put takes too long and effects small packet
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   799
		 * throughput, so unsplit small packets and save the alloc/put
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   800
		 * only valid in softirq (napi) context to call kmap_*
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   801
		 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   802
		if (l1 && (l1 <= copybreak) &&
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   803
		    ((length + l1) <= adapter->rx_ps_bsize0)) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   804
			u8 *vaddr;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   805
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   806
			ps_page = &buffer_info->ps_pages[0];
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   807
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   808
			/*
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   809
			 * there is no documentation about how to call
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   810
			 * kmap_atomic, so we can't hold the mapping
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   811
			 * very long
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   812
			 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   813
			pci_dma_sync_single_for_cpu(pdev, ps_page->dma,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   814
				PAGE_SIZE, PCI_DMA_FROMDEVICE);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   815
			vaddr = kmap_atomic(ps_page->page, KM_SKB_DATA_SOFTIRQ);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   816
			memcpy(skb_tail_pointer(skb), vaddr, l1);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   817
			kunmap_atomic(vaddr, KM_SKB_DATA_SOFTIRQ);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   818
			pci_dma_sync_single_for_device(pdev, ps_page->dma,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   819
				PAGE_SIZE, PCI_DMA_FROMDEVICE);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   820
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   821
			/* remove the CRC */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   822
			if (!(adapter->flags2 & FLAG2_CRC_STRIPPING))
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   823
				l1 -= 4;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   824
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   825
			skb_put(skb, l1);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   826
			goto copydone;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   827
		} /* if */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   828
		}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   829
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   830
		for (j = 0; j < PS_PAGE_BUFFERS; j++) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   831
			length = le16_to_cpu(rx_desc->wb.upper.length[j]);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   832
			if (!length)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   833
				break;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   834
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   835
			ps_page = &buffer_info->ps_pages[j];
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   836
			pci_unmap_page(pdev, ps_page->dma, PAGE_SIZE,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   837
				       PCI_DMA_FROMDEVICE);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   838
			ps_page->dma = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   839
			skb_fill_page_desc(skb, j, ps_page->page, 0, length);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   840
			ps_page->page = NULL;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   841
			skb->len += length;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   842
			skb->data_len += length;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   843
			skb->truesize += length;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   844
		}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   845
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   846
		/* strip the ethernet crc, problem is we're using pages now so
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   847
		 * this whole operation can get a little cpu intensive
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   848
		 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   849
		if (!(adapter->flags2 & FLAG2_CRC_STRIPPING))
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   850
			pskb_trim(skb, skb->len - 4);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   851
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   852
copydone:
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   853
		total_rx_bytes += skb->len;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   854
		total_rx_packets++;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   855
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   856
		e1000_rx_checksum(adapter, staterr, le16_to_cpu(
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   857
			rx_desc->wb.lower.hi_dword.csum_ip.csum), skb);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   858
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   859
		if (rx_desc->wb.upper.header_status &
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   860
			   cpu_to_le16(E1000_RXDPS_HDRSTAT_HDRSP))
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   861
			adapter->rx_hdr_split++;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   862
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   863
		e1000_receive_skb(adapter, netdev, skb,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   864
				  staterr, rx_desc->wb.middle.vlan);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   865
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   866
next_desc:
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   867
		rx_desc->wb.middle.status_error &= cpu_to_le32(~0xFF);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   868
		buffer_info->skb = NULL;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   869
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   870
		/* return some buffers to hardware, one at a time is too slow */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   871
		if (cleaned_count >= E1000_RX_BUFFER_WRITE) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   872
			adapter->alloc_rx_buf(adapter, cleaned_count);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   873
			cleaned_count = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   874
		}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   875
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   876
		/* use prefetched values */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   877
		rx_desc = next_rxd;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   878
		buffer_info = next_buffer;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   879
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   880
		staterr = le32_to_cpu(rx_desc->wb.middle.status_error);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   881
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   882
	rx_ring->next_to_clean = i;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   883
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   884
	cleaned_count = e1000_desc_unused(rx_ring);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   885
	if (cleaned_count)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   886
		adapter->alloc_rx_buf(adapter, cleaned_count);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   887
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   888
	adapter->total_rx_bytes += total_rx_bytes;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   889
	adapter->total_rx_packets += total_rx_packets;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   890
	adapter->net_stats.rx_bytes += total_rx_bytes;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   891
	adapter->net_stats.rx_packets += total_rx_packets;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   892
	return cleaned;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   893
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   894
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   895
/**
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   896
 * e1000_consume_page - helper function
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   897
 **/
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   898
static void e1000_consume_page(struct e1000_buffer *bi, struct sk_buff *skb,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   899
                               u16 length)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   900
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   901
	bi->page = NULL;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   902
	skb->len += length;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   903
	skb->data_len += length;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   904
	skb->truesize += length;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   905
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   906
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   907
/**
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   908
 * e1000_clean_jumbo_rx_irq - Send received data up the network stack; legacy
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   909
 * @adapter: board private structure
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   910
 *
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   911
 * the return value indicates whether actual cleaning was done, there
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   912
 * is no guarantee that everything was cleaned
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   913
 **/
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   914
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   915
static bool e1000_clean_jumbo_rx_irq(struct e1000_adapter *adapter,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   916
                                     int *work_done, int work_to_do)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   917
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   918
	struct net_device *netdev = adapter->netdev;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   919
	struct pci_dev *pdev = adapter->pdev;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   920
	struct e1000_ring *rx_ring = adapter->rx_ring;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   921
	struct e1000_rx_desc *rx_desc, *next_rxd;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   922
	struct e1000_buffer *buffer_info, *next_buffer;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   923
	u32 length;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   924
	unsigned int i;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   925
	int cleaned_count = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   926
	bool cleaned = false;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   927
	unsigned int total_rx_bytes=0, total_rx_packets=0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   928
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   929
	i = rx_ring->next_to_clean;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   930
	rx_desc = E1000_RX_DESC(*rx_ring, i);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   931
	buffer_info = &rx_ring->buffer_info[i];
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   932
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   933
	while (rx_desc->status & E1000_RXD_STAT_DD) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   934
		struct sk_buff *skb;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   935
		u8 status;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   936
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   937
		if (*work_done >= work_to_do)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   938
			break;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   939
		(*work_done)++;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   940
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   941
		status = rx_desc->status;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   942
		skb = buffer_info->skb;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   943
		buffer_info->skb = NULL;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   944
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   945
		++i;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   946
		if (i == rx_ring->count)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   947
			i = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   948
		next_rxd = E1000_RX_DESC(*rx_ring, i);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   949
		prefetch(next_rxd);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   950
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   951
		next_buffer = &rx_ring->buffer_info[i];
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   952
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   953
		cleaned = true;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   954
		cleaned_count++;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   955
		pci_unmap_page(pdev, buffer_info->dma, PAGE_SIZE,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   956
		               PCI_DMA_FROMDEVICE);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   957
		buffer_info->dma = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   958
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   959
		length = le16_to_cpu(rx_desc->length);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   960
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   961
		/* errors is only valid for DD + EOP descriptors */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   962
		if (unlikely((status & E1000_RXD_STAT_EOP) &&
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   963
		    (rx_desc->errors & E1000_RXD_ERR_FRAME_ERR_MASK))) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   964
				/* recycle both page and skb */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   965
				buffer_info->skb = skb;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   966
				/* an error means any chain goes out the window
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   967
				 * too */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   968
				if (rx_ring->rx_skb_top)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   969
					dev_kfree_skb(rx_ring->rx_skb_top);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   970
				rx_ring->rx_skb_top = NULL;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   971
				goto next_desc;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   972
		}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   973
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   974
#define rxtop rx_ring->rx_skb_top
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   975
		if (!(status & E1000_RXD_STAT_EOP)) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   976
			/* this descriptor is only the beginning (or middle) */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   977
			if (!rxtop) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   978
				/* this is the beginning of a chain */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   979
				rxtop = skb;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   980
				skb_fill_page_desc(rxtop, 0, buffer_info->page,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   981
				                   0, length);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   982
			} else {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   983
				/* this is the middle of a chain */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   984
				skb_fill_page_desc(rxtop,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   985
				    skb_shinfo(rxtop)->nr_frags,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   986
				    buffer_info->page, 0, length);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   987
				/* re-use the skb, only consumed the page */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   988
				buffer_info->skb = skb;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   989
			}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   990
			e1000_consume_page(buffer_info, rxtop, length);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   991
			goto next_desc;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   992
		} else {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   993
			if (rxtop) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   994
				/* end of the chain */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   995
				skb_fill_page_desc(rxtop,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   996
				    skb_shinfo(rxtop)->nr_frags,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   997
				    buffer_info->page, 0, length);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   998
				/* re-use the current skb, we only consumed the
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   999
				 * page */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1000
				buffer_info->skb = skb;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1001
				skb = rxtop;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1002
				rxtop = NULL;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1003
				e1000_consume_page(buffer_info, skb, length);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1004
			} else {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1005
				/* no chain, got EOP, this buf is the packet
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1006
				 * copybreak to save the put_page/alloc_page */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1007
				if (length <= copybreak &&
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1008
				    skb_tailroom(skb) >= length) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1009
					u8 *vaddr;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1010
					vaddr = kmap_atomic(buffer_info->page,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1011
					                   KM_SKB_DATA_SOFTIRQ);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1012
					memcpy(skb_tail_pointer(skb), vaddr,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1013
					       length);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1014
					kunmap_atomic(vaddr,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1015
					              KM_SKB_DATA_SOFTIRQ);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1016
					/* re-use the page, so don't erase
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1017
					 * buffer_info->page */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1018
					skb_put(skb, length);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1019
				} else {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1020
					skb_fill_page_desc(skb, 0,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1021
					                   buffer_info->page, 0,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1022
				                           length);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1023
					e1000_consume_page(buffer_info, skb,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1024
					                   length);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1025
				}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1026
			}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1027
		}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1028
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1029
		/* Receive Checksum Offload XXX recompute due to CRC strip? */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1030
		e1000_rx_checksum(adapter,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1031
		                  (u32)(status) |
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1032
		                  ((u32)(rx_desc->errors) << 24),
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1033
		                  le16_to_cpu(rx_desc->csum), skb);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1034
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1035
		/* probably a little skewed due to removing CRC */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1036
		total_rx_bytes += skb->len;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1037
		total_rx_packets++;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1038
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1039
		/* eth type trans needs skb->data to point to something */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1040
		if (!pskb_may_pull(skb, ETH_HLEN)) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1041
			e_err("pskb_may_pull failed.\n");
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1042
			dev_kfree_skb(skb);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1043
			goto next_desc;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1044
		}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1045
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1046
		e1000_receive_skb(adapter, netdev, skb, status,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1047
		                  rx_desc->special);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1048
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1049
next_desc:
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1050
		rx_desc->status = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1051
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1052
		/* return some buffers to hardware, one at a time is too slow */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1053
		if (unlikely(cleaned_count >= E1000_RX_BUFFER_WRITE)) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1054
			adapter->alloc_rx_buf(adapter, cleaned_count);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1055
			cleaned_count = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1056
		}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1057
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1058
		/* use prefetched values */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1059
		rx_desc = next_rxd;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1060
		buffer_info = next_buffer;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1061
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1062
	rx_ring->next_to_clean = i;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1063
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1064
	cleaned_count = e1000_desc_unused(rx_ring);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1065
	if (cleaned_count)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1066
		adapter->alloc_rx_buf(adapter, cleaned_count);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1067
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1068
	adapter->total_rx_bytes += total_rx_bytes;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1069
	adapter->total_rx_packets += total_rx_packets;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1070
	adapter->net_stats.rx_bytes += total_rx_bytes;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1071
	adapter->net_stats.rx_packets += total_rx_packets;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1072
	return cleaned;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1073
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1074
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1075
/**
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1076
 * e1000_clean_rx_ring - Free Rx Buffers per Queue
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1077
 * @adapter: board private structure
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1078
 **/
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1079
static void e1000_clean_rx_ring(struct e1000_adapter *adapter)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1080
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1081
	struct e1000_ring *rx_ring = adapter->rx_ring;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1082
	struct e1000_buffer *buffer_info;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1083
	struct e1000_ps_page *ps_page;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1084
	struct pci_dev *pdev = adapter->pdev;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1085
	unsigned int i, j;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1086
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1087
	/* Free all the Rx ring sk_buffs */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1088
	for (i = 0; i < rx_ring->count; i++) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1089
		buffer_info = &rx_ring->buffer_info[i];
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1090
		if (buffer_info->dma) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1091
			if (adapter->clean_rx == e1000_clean_rx_irq)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1092
				pci_unmap_single(pdev, buffer_info->dma,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1093
						 adapter->rx_buffer_len,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1094
						 PCI_DMA_FROMDEVICE);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1095
			else if (adapter->clean_rx == e1000_clean_jumbo_rx_irq)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1096
				pci_unmap_page(pdev, buffer_info->dma,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1097
				               PAGE_SIZE,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1098
				               PCI_DMA_FROMDEVICE);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1099
			else if (adapter->clean_rx == e1000_clean_rx_irq_ps)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1100
				pci_unmap_single(pdev, buffer_info->dma,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1101
						 adapter->rx_ps_bsize0,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1102
						 PCI_DMA_FROMDEVICE);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1103
			buffer_info->dma = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1104
		}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1105
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1106
		if (buffer_info->page) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1107
			put_page(buffer_info->page);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1108
			buffer_info->page = NULL;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1109
		}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1110
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1111
		if (buffer_info->skb) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1112
			dev_kfree_skb(buffer_info->skb);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1113
			buffer_info->skb = NULL;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1114
		}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1115
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1116
		for (j = 0; j < PS_PAGE_BUFFERS; j++) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1117
			ps_page = &buffer_info->ps_pages[j];
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1118
			if (!ps_page->page)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1119
				break;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1120
			pci_unmap_page(pdev, ps_page->dma, PAGE_SIZE,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1121
				       PCI_DMA_FROMDEVICE);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1122
			ps_page->dma = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1123
			put_page(ps_page->page);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1124
			ps_page->page = NULL;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1125
		}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1126
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1127
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1128
	/* there also may be some cached data from a chained receive */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1129
	if (rx_ring->rx_skb_top) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1130
		dev_kfree_skb(rx_ring->rx_skb_top);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1131
		rx_ring->rx_skb_top = NULL;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1132
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1133
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1134
	/* Zero out the descriptor ring */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1135
	memset(rx_ring->desc, 0, rx_ring->size);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1136
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1137
	rx_ring->next_to_clean = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1138
	rx_ring->next_to_use = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1139
	adapter->flags2 &= ~FLAG2_IS_DISCARDING;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1140
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1141
	writel(0, adapter->hw.hw_addr + rx_ring->head);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1142
	writel(0, adapter->hw.hw_addr + rx_ring->tail);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1143
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1144
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1145
static void e1000e_downshift_workaround(struct work_struct *work)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1146
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1147
	struct e1000_adapter *adapter = container_of(work,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1148
					struct e1000_adapter, downshift_task);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1149
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1150
	e1000e_gig_downshift_workaround_ich8lan(&adapter->hw);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1151
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1152
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1153
/**
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1154
 * e1000_intr_msi - Interrupt Handler
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1155
 * @irq: interrupt number
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1156
 * @data: pointer to a network interface device structure
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1157
 **/
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1158
static irqreturn_t e1000_intr_msi(int irq, void *data)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1159
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1160
	struct net_device *netdev = data;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1161
	struct e1000_adapter *adapter = netdev_priv(netdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1162
	struct e1000_hw *hw = &adapter->hw;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1163
	u32 icr = er32(ICR);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1164
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1165
	/*
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1166
	 * read ICR disables interrupts using IAM
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1167
	 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1168
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1169
	if (icr & E1000_ICR_LSC) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1170
		hw->mac.get_link_status = 1;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1171
		/*
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1172
		 * ICH8 workaround-- Call gig speed drop workaround on cable
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1173
		 * disconnect (LSC) before accessing any PHY registers
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1174
		 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1175
		if ((adapter->flags & FLAG_LSC_GIG_SPEED_DROP) &&
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1176
		    (!(er32(STATUS) & E1000_STATUS_LU)))
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1177
			schedule_work(&adapter->downshift_task);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1178
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1179
		/*
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1180
		 * 80003ES2LAN workaround-- For packet buffer work-around on
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1181
		 * link down event; disable receives here in the ISR and reset
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1182
		 * adapter in watchdog
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1183
		 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1184
		if (netif_carrier_ok(netdev) &&
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1185
		    adapter->flags & FLAG_RX_NEEDS_RESTART) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1186
			/* disable receives */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1187
			u32 rctl = er32(RCTL);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1188
			ew32(RCTL, rctl & ~E1000_RCTL_EN);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1189
			adapter->flags |= FLAG_RX_RESTART_NOW;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1190
		}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1191
		/* guard against interrupt when we're going down */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1192
		if (!test_bit(__E1000_DOWN, &adapter->state))
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1193
			mod_timer(&adapter->watchdog_timer, jiffies + 1);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1194
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1195
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1196
	if (napi_schedule_prep(&adapter->napi)) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1197
		adapter->total_tx_bytes = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1198
		adapter->total_tx_packets = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1199
		adapter->total_rx_bytes = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1200
		adapter->total_rx_packets = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1201
		__napi_schedule(&adapter->napi);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1202
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1203
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1204
	return IRQ_HANDLED;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1205
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1206
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1207
/**
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1208
 * e1000_intr - Interrupt Handler
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1209
 * @irq: interrupt number
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1210
 * @data: pointer to a network interface device structure
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1211
 **/
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1212
static irqreturn_t e1000_intr(int irq, void *data)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1213
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1214
	struct net_device *netdev = data;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1215
	struct e1000_adapter *adapter = netdev_priv(netdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1216
	struct e1000_hw *hw = &adapter->hw;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1217
	u32 rctl, icr = er32(ICR);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1218
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1219
	if (!icr)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1220
		return IRQ_NONE;  /* Not our interrupt */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1221
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1222
	/*
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1223
	 * IMS will not auto-mask if INT_ASSERTED is not set, and if it is
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1224
	 * not set, then the adapter didn't send an interrupt
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1225
	 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1226
	if (!(icr & E1000_ICR_INT_ASSERTED))
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1227
		return IRQ_NONE;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1228
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1229
	/*
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1230
	 * Interrupt Auto-Mask...upon reading ICR,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1231
	 * interrupts are masked.  No need for the
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1232
	 * IMC write
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1233
	 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1234
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1235
	if (icr & E1000_ICR_LSC) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1236
		hw->mac.get_link_status = 1;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1237
		/*
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1238
		 * ICH8 workaround-- Call gig speed drop workaround on cable
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1239
		 * disconnect (LSC) before accessing any PHY registers
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1240
		 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1241
		if ((adapter->flags & FLAG_LSC_GIG_SPEED_DROP) &&
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1242
		    (!(er32(STATUS) & E1000_STATUS_LU)))
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1243
			schedule_work(&adapter->downshift_task);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1244
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1245
		/*
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1246
		 * 80003ES2LAN workaround--
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1247
		 * For packet buffer work-around on link down event;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1248
		 * disable receives here in the ISR and
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1249
		 * reset adapter in watchdog
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1250
		 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1251
		if (netif_carrier_ok(netdev) &&
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1252
		    (adapter->flags & FLAG_RX_NEEDS_RESTART)) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1253
			/* disable receives */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1254
			rctl = er32(RCTL);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1255
			ew32(RCTL, rctl & ~E1000_RCTL_EN);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1256
			adapter->flags |= FLAG_RX_RESTART_NOW;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1257
		}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1258
		/* guard against interrupt when we're going down */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1259
		if (!test_bit(__E1000_DOWN, &adapter->state))
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1260
			mod_timer(&adapter->watchdog_timer, jiffies + 1);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1261
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1262
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1263
	if (napi_schedule_prep(&adapter->napi)) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1264
		adapter->total_tx_bytes = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1265
		adapter->total_tx_packets = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1266
		adapter->total_rx_bytes = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1267
		adapter->total_rx_packets = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1268
		__napi_schedule(&adapter->napi);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1269
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1270
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1271
	return IRQ_HANDLED;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1272
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1273
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1274
static irqreturn_t e1000_msix_other(int irq, void *data)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1275
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1276
	struct net_device *netdev = data;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1277
	struct e1000_adapter *adapter = netdev_priv(netdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1278
	struct e1000_hw *hw = &adapter->hw;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1279
	u32 icr = er32(ICR);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1280
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1281
	if (!(icr & E1000_ICR_INT_ASSERTED)) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1282
		if (!test_bit(__E1000_DOWN, &adapter->state))
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1283
			ew32(IMS, E1000_IMS_OTHER);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1284
		return IRQ_NONE;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1285
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1286
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1287
	if (icr & adapter->eiac_mask)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1288
		ew32(ICS, (icr & adapter->eiac_mask));
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1289
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1290
	if (icr & E1000_ICR_OTHER) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1291
		if (!(icr & E1000_ICR_LSC))
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1292
			goto no_link_interrupt;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1293
		hw->mac.get_link_status = 1;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1294
		/* guard against interrupt when we're going down */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1295
		if (!test_bit(__E1000_DOWN, &adapter->state))
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1296
			mod_timer(&adapter->watchdog_timer, jiffies + 1);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1297
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1298
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1299
no_link_interrupt:
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1300
	if (!test_bit(__E1000_DOWN, &adapter->state))
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1301
		ew32(IMS, E1000_IMS_LSC | E1000_IMS_OTHER);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1302
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1303
	return IRQ_HANDLED;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1304
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1305
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1306
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1307
static irqreturn_t e1000_intr_msix_tx(int irq, void *data)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1308
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1309
	struct net_device *netdev = data;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1310
	struct e1000_adapter *adapter = netdev_priv(netdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1311
	struct e1000_hw *hw = &adapter->hw;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1312
	struct e1000_ring *tx_ring = adapter->tx_ring;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1313
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1314
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1315
	adapter->total_tx_bytes = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1316
	adapter->total_tx_packets = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1317
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1318
	if (!e1000_clean_tx_irq(adapter))
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1319
		/* Ring was not completely cleaned, so fire another interrupt */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1320
		ew32(ICS, tx_ring->ims_val);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1321
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1322
	return IRQ_HANDLED;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1323
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1324
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1325
static irqreturn_t e1000_intr_msix_rx(int irq, void *data)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1326
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1327
	struct net_device *netdev = data;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1328
	struct e1000_adapter *adapter = netdev_priv(netdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1329
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1330
	/* Write the ITR value calculated at the end of the
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1331
	 * previous interrupt.
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1332
	 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1333
	if (adapter->rx_ring->set_itr) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1334
		writel(1000000000 / (adapter->rx_ring->itr_val * 256),
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1335
		       adapter->hw.hw_addr + adapter->rx_ring->itr_register);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1336
		adapter->rx_ring->set_itr = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1337
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1338
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1339
	if (napi_schedule_prep(&adapter->napi)) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1340
		adapter->total_rx_bytes = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1341
		adapter->total_rx_packets = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1342
		__napi_schedule(&adapter->napi);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1343
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1344
	return IRQ_HANDLED;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1345
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1346
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1347
/**
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1348
 * e1000_configure_msix - Configure MSI-X hardware
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1349
 *
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1350
 * e1000_configure_msix sets up the hardware to properly
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1351
 * generate MSI-X interrupts.
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1352
 **/
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1353
static void e1000_configure_msix(struct e1000_adapter *adapter)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1354
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1355
	struct e1000_hw *hw = &adapter->hw;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1356
	struct e1000_ring *rx_ring = adapter->rx_ring;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1357
	struct e1000_ring *tx_ring = adapter->tx_ring;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1358
	int vector = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1359
	u32 ctrl_ext, ivar = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1360
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1361
	adapter->eiac_mask = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1362
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1363
	/* Workaround issue with spurious interrupts on 82574 in MSI-X mode */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1364
	if (hw->mac.type == e1000_82574) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1365
		u32 rfctl = er32(RFCTL);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1366
		rfctl |= E1000_RFCTL_ACK_DIS;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1367
		ew32(RFCTL, rfctl);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1368
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1369
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1370
#define E1000_IVAR_INT_ALLOC_VALID	0x8
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1371
	/* Configure Rx vector */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1372
	rx_ring->ims_val = E1000_IMS_RXQ0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1373
	adapter->eiac_mask |= rx_ring->ims_val;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1374
	if (rx_ring->itr_val)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1375
		writel(1000000000 / (rx_ring->itr_val * 256),
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1376
		       hw->hw_addr + rx_ring->itr_register);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1377
	else
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1378
		writel(1, hw->hw_addr + rx_ring->itr_register);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1379
	ivar = E1000_IVAR_INT_ALLOC_VALID | vector;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1380
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1381
	/* Configure Tx vector */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1382
	tx_ring->ims_val = E1000_IMS_TXQ0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1383
	vector++;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1384
	if (tx_ring->itr_val)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1385
		writel(1000000000 / (tx_ring->itr_val * 256),
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1386
		       hw->hw_addr + tx_ring->itr_register);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1387
	else
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1388
		writel(1, hw->hw_addr + tx_ring->itr_register);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1389
	adapter->eiac_mask |= tx_ring->ims_val;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1390
	ivar |= ((E1000_IVAR_INT_ALLOC_VALID | vector) << 8);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1391
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1392
	/* set vector for Other Causes, e.g. link changes */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1393
	vector++;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1394
	ivar |= ((E1000_IVAR_INT_ALLOC_VALID | vector) << 16);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1395
	if (rx_ring->itr_val)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1396
		writel(1000000000 / (rx_ring->itr_val * 256),
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1397
		       hw->hw_addr + E1000_EITR_82574(vector));
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1398
	else
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1399
		writel(1, hw->hw_addr + E1000_EITR_82574(vector));
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1400
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1401
	/* Cause Tx interrupts on every write back */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1402
	ivar |= (1 << 31);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1403
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1404
	ew32(IVAR, ivar);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1405
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1406
	/* enable MSI-X PBA support */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1407
	ctrl_ext = er32(CTRL_EXT);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1408
	ctrl_ext |= E1000_CTRL_EXT_PBA_CLR;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1409
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1410
	/* Auto-Mask Other interrupts upon ICR read */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1411
#define E1000_EIAC_MASK_82574   0x01F00000
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1412
	ew32(IAM, ~E1000_EIAC_MASK_82574 | E1000_IMS_OTHER);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1413
	ctrl_ext |= E1000_CTRL_EXT_EIAME;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1414
	ew32(CTRL_EXT, ctrl_ext);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1415
	e1e_flush();
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1416
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1417
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1418
void e1000e_reset_interrupt_capability(struct e1000_adapter *adapter)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1419
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1420
	if (adapter->msix_entries) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1421
		pci_disable_msix(adapter->pdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1422
		kfree(adapter->msix_entries);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1423
		adapter->msix_entries = NULL;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1424
	} else if (adapter->flags & FLAG_MSI_ENABLED) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1425
		pci_disable_msi(adapter->pdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1426
		adapter->flags &= ~FLAG_MSI_ENABLED;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1427
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1428
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1429
	return;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1430
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1431
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1432
/**
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1433
 * e1000e_set_interrupt_capability - set MSI or MSI-X if supported
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1434
 *
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1435
 * Attempt to configure interrupts using the best available
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1436
 * capabilities of the hardware and kernel.
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1437
 **/
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1438
void e1000e_set_interrupt_capability(struct e1000_adapter *adapter)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1439
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1440
	int err;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1441
	int numvecs, i;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1442
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1443
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1444
	switch (adapter->int_mode) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1445
	case E1000E_INT_MODE_MSIX:
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1446
		if (adapter->flags & FLAG_HAS_MSIX) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1447
			numvecs = 3; /* RxQ0, TxQ0 and other */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1448
			adapter->msix_entries = kcalloc(numvecs,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1449
						      sizeof(struct msix_entry),
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1450
						      GFP_KERNEL);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1451
			if (adapter->msix_entries) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1452
				for (i = 0; i < numvecs; i++)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1453
					adapter->msix_entries[i].entry = i;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1454
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1455
				err = pci_enable_msix(adapter->pdev,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1456
						      adapter->msix_entries,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1457
						      numvecs);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1458
				if (err == 0)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1459
					return;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1460
			}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1461
			/* MSI-X failed, so fall through and try MSI */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1462
			e_err("Failed to initialize MSI-X interrupts.  "
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1463
			      "Falling back to MSI interrupts.\n");
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1464
			e1000e_reset_interrupt_capability(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1465
		}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1466
		adapter->int_mode = E1000E_INT_MODE_MSI;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1467
		/* Fall through */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1468
	case E1000E_INT_MODE_MSI:
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1469
		if (!pci_enable_msi(adapter->pdev)) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1470
			adapter->flags |= FLAG_MSI_ENABLED;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1471
		} else {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1472
			adapter->int_mode = E1000E_INT_MODE_LEGACY;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1473
			e_err("Failed to initialize MSI interrupts.  Falling "
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1474
			      "back to legacy interrupts.\n");
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1475
		}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1476
		/* Fall through */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1477
	case E1000E_INT_MODE_LEGACY:
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1478
		/* Don't do anything; this is the system default */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1479
		break;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1480
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1481
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1482
	return;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1483
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1484
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1485
/**
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1486
 * e1000_request_msix - Initialize MSI-X interrupts
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1487
 *
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1488
 * e1000_request_msix allocates MSI-X vectors and requests interrupts from the
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1489
 * kernel.
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1490
 **/
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1491
static int e1000_request_msix(struct e1000_adapter *adapter)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1492
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1493
	struct net_device *netdev = adapter->netdev;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1494
	int err = 0, vector = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1495
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1496
	if (strlen(netdev->name) < (IFNAMSIZ - 5))
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1497
		sprintf(adapter->rx_ring->name, "%s-rx-0", netdev->name);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1498
	else
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1499
		memcpy(adapter->rx_ring->name, netdev->name, IFNAMSIZ);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1500
	err = request_irq(adapter->msix_entries[vector].vector,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1501
			  &e1000_intr_msix_rx, 0, adapter->rx_ring->name,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1502
			  netdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1503
	if (err)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1504
		goto out;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1505
	adapter->rx_ring->itr_register = E1000_EITR_82574(vector);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1506
	adapter->rx_ring->itr_val = adapter->itr;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1507
	vector++;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1508
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1509
	if (strlen(netdev->name) < (IFNAMSIZ - 5))
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1510
		sprintf(adapter->tx_ring->name, "%s-tx-0", netdev->name);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1511
	else
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1512
		memcpy(adapter->tx_ring->name, netdev->name, IFNAMSIZ);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1513
	err = request_irq(adapter->msix_entries[vector].vector,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1514
			  &e1000_intr_msix_tx, 0, adapter->tx_ring->name,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1515
			  netdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1516
	if (err)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1517
		goto out;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1518
	adapter->tx_ring->itr_register = E1000_EITR_82574(vector);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1519
	adapter->tx_ring->itr_val = adapter->itr;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1520
	vector++;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1521
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1522
	err = request_irq(adapter->msix_entries[vector].vector,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1523
			  &e1000_msix_other, 0, netdev->name, netdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1524
	if (err)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1525
		goto out;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1526
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1527
	e1000_configure_msix(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1528
	return 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1529
out:
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1530
	return err;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1531
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1532
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1533
/**
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1534
 * e1000_request_irq - initialize interrupts
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1535
 *
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1536
 * Attempts to configure interrupts using the best available
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1537
 * capabilities of the hardware and kernel.
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1538
 **/
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1539
static int e1000_request_irq(struct e1000_adapter *adapter)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1540
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1541
	struct net_device *netdev = adapter->netdev;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1542
	int err;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1543
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1544
	if (adapter->msix_entries) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1545
		err = e1000_request_msix(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1546
		if (!err)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1547
			return err;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1548
		/* fall back to MSI */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1549
		e1000e_reset_interrupt_capability(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1550
		adapter->int_mode = E1000E_INT_MODE_MSI;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1551
		e1000e_set_interrupt_capability(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1552
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1553
	if (adapter->flags & FLAG_MSI_ENABLED) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1554
		err = request_irq(adapter->pdev->irq, &e1000_intr_msi, 0,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1555
				  netdev->name, netdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1556
		if (!err)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1557
			return err;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1558
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1559
		/* fall back to legacy interrupt */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1560
		e1000e_reset_interrupt_capability(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1561
		adapter->int_mode = E1000E_INT_MODE_LEGACY;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1562
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1563
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1564
	err = request_irq(adapter->pdev->irq, &e1000_intr, IRQF_SHARED,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1565
			  netdev->name, netdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1566
	if (err)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1567
		e_err("Unable to allocate interrupt, Error: %d\n", err);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1568
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1569
	return err;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1570
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1571
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1572
static void e1000_free_irq(struct e1000_adapter *adapter)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1573
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1574
	struct net_device *netdev = adapter->netdev;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1575
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1576
	if (adapter->msix_entries) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1577
		int vector = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1578
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1579
		free_irq(adapter->msix_entries[vector].vector, netdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1580
		vector++;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1581
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1582
		free_irq(adapter->msix_entries[vector].vector, netdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1583
		vector++;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1584
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1585
		/* Other Causes interrupt vector */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1586
		free_irq(adapter->msix_entries[vector].vector, netdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1587
		return;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1588
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1589
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1590
	free_irq(adapter->pdev->irq, netdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1591
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1592
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1593
/**
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1594
 * e1000_irq_disable - Mask off interrupt generation on the NIC
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1595
 **/
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1596
static void e1000_irq_disable(struct e1000_adapter *adapter)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1597
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1598
	struct e1000_hw *hw = &adapter->hw;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1599
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1600
	ew32(IMC, ~0);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1601
	if (adapter->msix_entries)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1602
		ew32(EIAC_82574, 0);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1603
	e1e_flush();
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1604
	synchronize_irq(adapter->pdev->irq);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1605
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1606
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1607
/**
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1608
 * e1000_irq_enable - Enable default interrupt generation settings
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1609
 **/
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1610
static void e1000_irq_enable(struct e1000_adapter *adapter)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1611
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1612
	struct e1000_hw *hw = &adapter->hw;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1613
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1614
	if (adapter->msix_entries) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1615
		ew32(EIAC_82574, adapter->eiac_mask & E1000_EIAC_MASK_82574);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1616
		ew32(IMS, adapter->eiac_mask | E1000_IMS_OTHER | E1000_IMS_LSC);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1617
	} else {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1618
		ew32(IMS, IMS_ENABLE_MASK);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1619
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1620
	e1e_flush();
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1621
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1622
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1623
/**
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1624
 * e1000_get_hw_control - get control of the h/w from f/w
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1625
 * @adapter: address of board private structure
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1626
 *
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1627
 * e1000_get_hw_control sets {CTRL_EXT|SWSM}:DRV_LOAD bit.
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1628
 * For ASF and Pass Through versions of f/w this means that
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1629
 * the driver is loaded. For AMT version (only with 82573)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1630
 * of the f/w this means that the network i/f is open.
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1631
 **/
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1632
static void e1000_get_hw_control(struct e1000_adapter *adapter)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1633
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1634
	struct e1000_hw *hw = &adapter->hw;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1635
	u32 ctrl_ext;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1636
	u32 swsm;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1637
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1638
	/* Let firmware know the driver has taken over */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1639
	if (adapter->flags & FLAG_HAS_SWSM_ON_LOAD) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1640
		swsm = er32(SWSM);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1641
		ew32(SWSM, swsm | E1000_SWSM_DRV_LOAD);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1642
	} else if (adapter->flags & FLAG_HAS_CTRLEXT_ON_LOAD) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1643
		ctrl_ext = er32(CTRL_EXT);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1644
		ew32(CTRL_EXT, ctrl_ext | E1000_CTRL_EXT_DRV_LOAD);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1645
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1646
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1647
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1648
/**
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1649
 * e1000_release_hw_control - release control of the h/w to f/w
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1650
 * @adapter: address of board private structure
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1651
 *
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1652
 * e1000_release_hw_control resets {CTRL_EXT|SWSM}:DRV_LOAD bit.
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1653
 * For ASF and Pass Through versions of f/w this means that the
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1654
 * driver is no longer loaded. For AMT version (only with 82573) i
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1655
 * of the f/w this means that the network i/f is closed.
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1656
 *
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1657
 **/
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1658
static void e1000_release_hw_control(struct e1000_adapter *adapter)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1659
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1660
	struct e1000_hw *hw = &adapter->hw;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1661
	u32 ctrl_ext;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1662
	u32 swsm;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1663
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1664
	/* Let firmware taken over control of h/w */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1665
	if (adapter->flags & FLAG_HAS_SWSM_ON_LOAD) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1666
		swsm = er32(SWSM);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1667
		ew32(SWSM, swsm & ~E1000_SWSM_DRV_LOAD);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1668
	} else if (adapter->flags & FLAG_HAS_CTRLEXT_ON_LOAD) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1669
		ctrl_ext = er32(CTRL_EXT);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1670
		ew32(CTRL_EXT, ctrl_ext & ~E1000_CTRL_EXT_DRV_LOAD);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1671
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1672
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1673
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1674
/**
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1675
 * @e1000_alloc_ring - allocate memory for a ring structure
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1676
 **/
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1677
static int e1000_alloc_ring_dma(struct e1000_adapter *adapter,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1678
				struct e1000_ring *ring)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1679
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1680
	struct pci_dev *pdev = adapter->pdev;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1681
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1682
	ring->desc = dma_alloc_coherent(&pdev->dev, ring->size, &ring->dma,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1683
					GFP_KERNEL);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1684
	if (!ring->desc)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1685
		return -ENOMEM;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1686
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1687
	return 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1688
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1689
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1690
/**
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1691
 * e1000e_setup_tx_resources - allocate Tx resources (Descriptors)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1692
 * @adapter: board private structure
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1693
 *
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1694
 * Return 0 on success, negative on failure
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1695
 **/
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1696
int e1000e_setup_tx_resources(struct e1000_adapter *adapter)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1697
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1698
	struct e1000_ring *tx_ring = adapter->tx_ring;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1699
	int err = -ENOMEM, size;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1700
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1701
	size = sizeof(struct e1000_buffer) * tx_ring->count;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1702
	tx_ring->buffer_info = vmalloc(size);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1703
	if (!tx_ring->buffer_info)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1704
		goto err;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1705
	memset(tx_ring->buffer_info, 0, size);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1706
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1707
	/* round up to nearest 4K */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1708
	tx_ring->size = tx_ring->count * sizeof(struct e1000_tx_desc);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1709
	tx_ring->size = ALIGN(tx_ring->size, 4096);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1710
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1711
	err = e1000_alloc_ring_dma(adapter, tx_ring);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1712
	if (err)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1713
		goto err;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1714
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1715
	tx_ring->next_to_use = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1716
	tx_ring->next_to_clean = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1717
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1718
	return 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1719
err:
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1720
	vfree(tx_ring->buffer_info);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1721
	e_err("Unable to allocate memory for the transmit descriptor ring\n");
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1722
	return err;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1723
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1724
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1725
/**
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1726
 * e1000e_setup_rx_resources - allocate Rx resources (Descriptors)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1727
 * @adapter: board private structure
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1728
 *
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1729
 * Returns 0 on success, negative on failure
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1730
 **/
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1731
int e1000e_setup_rx_resources(struct e1000_adapter *adapter)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1732
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1733
	struct e1000_ring *rx_ring = adapter->rx_ring;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1734
	struct e1000_buffer *buffer_info;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1735
	int i, size, desc_len, err = -ENOMEM;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1736
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1737
	size = sizeof(struct e1000_buffer) * rx_ring->count;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1738
	rx_ring->buffer_info = vmalloc(size);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1739
	if (!rx_ring->buffer_info)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1740
		goto err;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1741
	memset(rx_ring->buffer_info, 0, size);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1742
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1743
	for (i = 0; i < rx_ring->count; i++) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1744
		buffer_info = &rx_ring->buffer_info[i];
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1745
		buffer_info->ps_pages = kcalloc(PS_PAGE_BUFFERS,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1746
						sizeof(struct e1000_ps_page),
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1747
						GFP_KERNEL);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1748
		if (!buffer_info->ps_pages)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1749
			goto err_pages;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1750
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1751
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1752
	desc_len = sizeof(union e1000_rx_desc_packet_split);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1753
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1754
	/* Round up to nearest 4K */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1755
	rx_ring->size = rx_ring->count * desc_len;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1756
	rx_ring->size = ALIGN(rx_ring->size, 4096);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1757
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1758
	err = e1000_alloc_ring_dma(adapter, rx_ring);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1759
	if (err)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1760
		goto err_pages;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1761
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1762
	rx_ring->next_to_clean = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1763
	rx_ring->next_to_use = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1764
	rx_ring->rx_skb_top = NULL;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1765
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1766
	return 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1767
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1768
err_pages:
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1769
	for (i = 0; i < rx_ring->count; i++) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1770
		buffer_info = &rx_ring->buffer_info[i];
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1771
		kfree(buffer_info->ps_pages);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1772
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1773
err:
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1774
	vfree(rx_ring->buffer_info);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1775
	e_err("Unable to allocate memory for the transmit descriptor ring\n");
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1776
	return err;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1777
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1778
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1779
/**
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1780
 * e1000_clean_tx_ring - Free Tx Buffers
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1781
 * @adapter: board private structure
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1782
 **/
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1783
static void e1000_clean_tx_ring(struct e1000_adapter *adapter)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1784
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1785
	struct e1000_ring *tx_ring = adapter->tx_ring;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1786
	struct e1000_buffer *buffer_info;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1787
	unsigned long size;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1788
	unsigned int i;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1789
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1790
	for (i = 0; i < tx_ring->count; i++) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1791
		buffer_info = &tx_ring->buffer_info[i];
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1792
		e1000_put_txbuf(adapter, buffer_info);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1793
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1794
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1795
	size = sizeof(struct e1000_buffer) * tx_ring->count;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1796
	memset(tx_ring->buffer_info, 0, size);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1797
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1798
	memset(tx_ring->desc, 0, tx_ring->size);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1799
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1800
	tx_ring->next_to_use = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1801
	tx_ring->next_to_clean = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1802
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1803
	writel(0, adapter->hw.hw_addr + tx_ring->head);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1804
	writel(0, adapter->hw.hw_addr + tx_ring->tail);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1805
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1806
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1807
/**
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1808
 * e1000e_free_tx_resources - Free Tx Resources per Queue
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1809
 * @adapter: board private structure
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1810
 *
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1811
 * Free all transmit software resources
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1812
 **/
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1813
void e1000e_free_tx_resources(struct e1000_adapter *adapter)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1814
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1815
	struct pci_dev *pdev = adapter->pdev;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1816
	struct e1000_ring *tx_ring = adapter->tx_ring;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1817
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1818
	e1000_clean_tx_ring(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1819
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1820
	vfree(tx_ring->buffer_info);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1821
	tx_ring->buffer_info = NULL;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1822
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1823
	dma_free_coherent(&pdev->dev, tx_ring->size, tx_ring->desc,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1824
			  tx_ring->dma);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1825
	tx_ring->desc = NULL;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1826
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1827
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1828
/**
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1829
 * e1000e_free_rx_resources - Free Rx Resources
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1830
 * @adapter: board private structure
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1831
 *
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1832
 * Free all receive software resources
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1833
 **/
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1834
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1835
void e1000e_free_rx_resources(struct e1000_adapter *adapter)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1836
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1837
	struct pci_dev *pdev = adapter->pdev;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1838
	struct e1000_ring *rx_ring = adapter->rx_ring;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1839
	int i;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1840
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1841
	e1000_clean_rx_ring(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1842
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1843
	for (i = 0; i < rx_ring->count; i++) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1844
		kfree(rx_ring->buffer_info[i].ps_pages);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1845
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1846
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1847
	vfree(rx_ring->buffer_info);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1848
	rx_ring->buffer_info = NULL;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1849
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1850
	dma_free_coherent(&pdev->dev, rx_ring->size, rx_ring->desc,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1851
			  rx_ring->dma);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1852
	rx_ring->desc = NULL;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1853
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1854
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1855
/**
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1856
 * e1000_update_itr - update the dynamic ITR value based on statistics
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1857
 * @adapter: pointer to adapter
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1858
 * @itr_setting: current adapter->itr
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1859
 * @packets: the number of packets during this measurement interval
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1860
 * @bytes: the number of bytes during this measurement interval
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1861
 *
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1862
 *      Stores a new ITR value based on packets and byte
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1863
 *      counts during the last interrupt.  The advantage of per interrupt
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1864
 *      computation is faster updates and more accurate ITR for the current
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1865
 *      traffic pattern.  Constants in this function were computed
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1866
 *      based on theoretical maximum wire speed and thresholds were set based
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1867
 *      on testing data as well as attempting to minimize response time
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1868
 *      while increasing bulk throughput.  This functionality is controlled
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1869
 *      by the InterruptThrottleRate module parameter.
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1870
 **/
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1871
static unsigned int e1000_update_itr(struct e1000_adapter *adapter,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1872
				     u16 itr_setting, int packets,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1873
				     int bytes)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1874
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1875
	unsigned int retval = itr_setting;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1876
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1877
	if (packets == 0)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1878
		goto update_itr_done;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1879
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1880
	switch (itr_setting) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1881
	case lowest_latency:
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1882
		/* handle TSO and jumbo frames */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1883
		if (bytes/packets > 8000)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1884
			retval = bulk_latency;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1885
		else if ((packets < 5) && (bytes > 512)) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1886
			retval = low_latency;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1887
		}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1888
		break;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1889
	case low_latency:  /* 50 usec aka 20000 ints/s */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1890
		if (bytes > 10000) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1891
			/* this if handles the TSO accounting */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1892
			if (bytes/packets > 8000) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1893
				retval = bulk_latency;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1894
			} else if ((packets < 10) || ((bytes/packets) > 1200)) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1895
				retval = bulk_latency;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1896
			} else if ((packets > 35)) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1897
				retval = lowest_latency;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1898
			}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1899
		} else if (bytes/packets > 2000) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1900
			retval = bulk_latency;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1901
		} else if (packets <= 2 && bytes < 512) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1902
			retval = lowest_latency;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1903
		}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1904
		break;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1905
	case bulk_latency: /* 250 usec aka 4000 ints/s */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1906
		if (bytes > 25000) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1907
			if (packets > 35) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1908
				retval = low_latency;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1909
			}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1910
		} else if (bytes < 6000) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1911
			retval = low_latency;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1912
		}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1913
		break;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1914
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1915
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1916
update_itr_done:
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1917
	return retval;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1918
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1919
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1920
static void e1000_set_itr(struct e1000_adapter *adapter)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1921
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1922
	struct e1000_hw *hw = &adapter->hw;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1923
	u16 current_itr;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1924
	u32 new_itr = adapter->itr;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1925
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1926
	/* for non-gigabit speeds, just fix the interrupt rate at 4000 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1927
	if (adapter->link_speed != SPEED_1000) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1928
		current_itr = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1929
		new_itr = 4000;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1930
		goto set_itr_now;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1931
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1932
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1933
	adapter->tx_itr = e1000_update_itr(adapter,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1934
				    adapter->tx_itr,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1935
				    adapter->total_tx_packets,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1936
				    adapter->total_tx_bytes);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1937
	/* conservative mode (itr 3) eliminates the lowest_latency setting */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1938
	if (adapter->itr_setting == 3 && adapter->tx_itr == lowest_latency)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1939
		adapter->tx_itr = low_latency;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1940
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1941
	adapter->rx_itr = e1000_update_itr(adapter,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1942
				    adapter->rx_itr,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1943
				    adapter->total_rx_packets,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1944
				    adapter->total_rx_bytes);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1945
	/* conservative mode (itr 3) eliminates the lowest_latency setting */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1946
	if (adapter->itr_setting == 3 && adapter->rx_itr == lowest_latency)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1947
		adapter->rx_itr = low_latency;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1948
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1949
	current_itr = max(adapter->rx_itr, adapter->tx_itr);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1950
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1951
	switch (current_itr) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1952
	/* counts and packets in update_itr are dependent on these numbers */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1953
	case lowest_latency:
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1954
		new_itr = 70000;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1955
		break;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1956
	case low_latency:
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1957
		new_itr = 20000; /* aka hwitr = ~200 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1958
		break;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1959
	case bulk_latency:
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1960
		new_itr = 4000;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1961
		break;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1962
	default:
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1963
		break;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1964
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1965
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1966
set_itr_now:
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1967
	if (new_itr != adapter->itr) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1968
		/*
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1969
		 * this attempts to bias the interrupt rate towards Bulk
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1970
		 * by adding intermediate steps when interrupt rate is
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1971
		 * increasing
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1972
		 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1973
		new_itr = new_itr > adapter->itr ?
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1974
			     min(adapter->itr + (new_itr >> 2), new_itr) :
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1975
			     new_itr;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1976
		adapter->itr = new_itr;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1977
		adapter->rx_ring->itr_val = new_itr;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1978
		if (adapter->msix_entries)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1979
			adapter->rx_ring->set_itr = 1;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1980
		else
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1981
			ew32(ITR, 1000000000 / (new_itr * 256));
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1982
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1983
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1984
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1985
/**
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1986
 * e1000_alloc_queues - Allocate memory for all rings
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1987
 * @adapter: board private structure to initialize
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1988
 **/
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1989
static int __devinit e1000_alloc_queues(struct e1000_adapter *adapter)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1990
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1991
	adapter->tx_ring = kzalloc(sizeof(struct e1000_ring), GFP_KERNEL);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1992
	if (!adapter->tx_ring)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1993
		goto err;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1994
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1995
	adapter->rx_ring = kzalloc(sizeof(struct e1000_ring), GFP_KERNEL);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1996
	if (!adapter->rx_ring)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1997
		goto err;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1998
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1999
	return 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2000
err:
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2001
	e_err("Unable to allocate memory for queues\n");
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2002
	kfree(adapter->rx_ring);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2003
	kfree(adapter->tx_ring);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2004
	return -ENOMEM;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2005
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2006
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2007
/**
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2008
 * e1000_clean - NAPI Rx polling callback
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2009
 * @napi: struct associated with this polling callback
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2010
 * @budget: amount of packets driver is allowed to process this poll
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2011
 **/
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2012
static int e1000_clean(struct napi_struct *napi, int budget)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2013
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2014
	struct e1000_adapter *adapter = container_of(napi, struct e1000_adapter, napi);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2015
	struct e1000_hw *hw = &adapter->hw;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2016
	struct net_device *poll_dev = adapter->netdev;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2017
	int tx_cleaned = 1, work_done = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2018
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2019
	adapter = netdev_priv(poll_dev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2020
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2021
	if (adapter->msix_entries &&
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2022
	    !(adapter->rx_ring->ims_val & adapter->tx_ring->ims_val))
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2023
		goto clean_rx;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2024
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2025
	tx_cleaned = e1000_clean_tx_irq(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2026
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2027
clean_rx:
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2028
	adapter->clean_rx(adapter, &work_done, budget);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2029
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2030
	if (!tx_cleaned)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2031
		work_done = budget;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2032
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2033
	/* If budget not fully consumed, exit the polling mode */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2034
	if (work_done < budget) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2035
		if (adapter->itr_setting & 3)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2036
			e1000_set_itr(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2037
		napi_complete(napi);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2038
		if (!test_bit(__E1000_DOWN, &adapter->state)) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2039
			if (adapter->msix_entries)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2040
				ew32(IMS, adapter->rx_ring->ims_val);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2041
			else
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2042
				e1000_irq_enable(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2043
		}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2044
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2045
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2046
	return work_done;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2047
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2048
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2049
static void e1000_vlan_rx_add_vid(struct net_device *netdev, u16 vid)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2050
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2051
	struct e1000_adapter *adapter = netdev_priv(netdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2052
	struct e1000_hw *hw = &adapter->hw;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2053
	u32 vfta, index;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2054
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2055
	/* don't update vlan cookie if already programmed */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2056
	if ((adapter->hw.mng_cookie.status &
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2057
	     E1000_MNG_DHCP_COOKIE_STATUS_VLAN) &&
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2058
	    (vid == adapter->mng_vlan_id))
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2059
		return;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2060
	/* add VID to filter table */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2061
	index = (vid >> 5) & 0x7F;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2062
	vfta = E1000_READ_REG_ARRAY(hw, E1000_VFTA, index);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2063
	vfta |= (1 << (vid & 0x1F));
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2064
	e1000e_write_vfta(hw, index, vfta);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2065
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2066
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2067
static void e1000_vlan_rx_kill_vid(struct net_device *netdev, u16 vid)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2068
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2069
	struct e1000_adapter *adapter = netdev_priv(netdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2070
	struct e1000_hw *hw = &adapter->hw;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2071
	u32 vfta, index;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2072
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2073
	if (!test_bit(__E1000_DOWN, &adapter->state))
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2074
		e1000_irq_disable(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2075
	vlan_group_set_device(adapter->vlgrp, vid, NULL);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2076
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2077
	if (!test_bit(__E1000_DOWN, &adapter->state))
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2078
		e1000_irq_enable(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2079
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2080
	if ((adapter->hw.mng_cookie.status &
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2081
	     E1000_MNG_DHCP_COOKIE_STATUS_VLAN) &&
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2082
	    (vid == adapter->mng_vlan_id)) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2083
		/* release control to f/w */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2084
		e1000_release_hw_control(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2085
		return;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2086
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2087
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2088
	/* remove VID from filter table */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2089
	index = (vid >> 5) & 0x7F;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2090
	vfta = E1000_READ_REG_ARRAY(hw, E1000_VFTA, index);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2091
	vfta &= ~(1 << (vid & 0x1F));
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2092
	e1000e_write_vfta(hw, index, vfta);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2093
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2094
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2095
static void e1000_update_mng_vlan(struct e1000_adapter *adapter)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2096
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2097
	struct net_device *netdev = adapter->netdev;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2098
	u16 vid = adapter->hw.mng_cookie.vlan_id;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2099
	u16 old_vid = adapter->mng_vlan_id;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2100
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2101
	if (!adapter->vlgrp)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2102
		return;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2103
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2104
	if (!vlan_group_get_device(adapter->vlgrp, vid)) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2105
		adapter->mng_vlan_id = E1000_MNG_VLAN_NONE;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2106
		if (adapter->hw.mng_cookie.status &
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2107
			E1000_MNG_DHCP_COOKIE_STATUS_VLAN) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2108
			e1000_vlan_rx_add_vid(netdev, vid);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2109
			adapter->mng_vlan_id = vid;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2110
		}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2111
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2112
		if ((old_vid != (u16)E1000_MNG_VLAN_NONE) &&
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2113
				(vid != old_vid) &&
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2114
		    !vlan_group_get_device(adapter->vlgrp, old_vid))
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2115
			e1000_vlan_rx_kill_vid(netdev, old_vid);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2116
	} else {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2117
		adapter->mng_vlan_id = vid;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2118
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2119
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2120
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2121
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2122
static void e1000_vlan_rx_register(struct net_device *netdev,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2123
				   struct vlan_group *grp)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2124
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2125
	struct e1000_adapter *adapter = netdev_priv(netdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2126
	struct e1000_hw *hw = &adapter->hw;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2127
	u32 ctrl, rctl;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2128
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2129
	if (!test_bit(__E1000_DOWN, &adapter->state))
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2130
		e1000_irq_disable(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2131
	adapter->vlgrp = grp;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2132
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2133
	if (grp) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2134
		/* enable VLAN tag insert/strip */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2135
		ctrl = er32(CTRL);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2136
		ctrl |= E1000_CTRL_VME;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2137
		ew32(CTRL, ctrl);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2138
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2139
		if (adapter->flags & FLAG_HAS_HW_VLAN_FILTER) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2140
			/* enable VLAN receive filtering */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2141
			rctl = er32(RCTL);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2142
			rctl &= ~E1000_RCTL_CFIEN;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2143
			ew32(RCTL, rctl);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2144
			e1000_update_mng_vlan(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2145
		}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2146
	} else {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2147
		/* disable VLAN tag insert/strip */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2148
		ctrl = er32(CTRL);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2149
		ctrl &= ~E1000_CTRL_VME;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2150
		ew32(CTRL, ctrl);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2151
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2152
		if (adapter->flags & FLAG_HAS_HW_VLAN_FILTER) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2153
			if (adapter->mng_vlan_id !=
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2154
			    (u16)E1000_MNG_VLAN_NONE) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2155
				e1000_vlan_rx_kill_vid(netdev,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2156
						       adapter->mng_vlan_id);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2157
				adapter->mng_vlan_id = E1000_MNG_VLAN_NONE;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2158
			}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2159
		}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2160
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2161
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2162
	if (!test_bit(__E1000_DOWN, &adapter->state))
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2163
		e1000_irq_enable(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2164
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2165
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2166
static void e1000_restore_vlan(struct e1000_adapter *adapter)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2167
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2168
	u16 vid;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2169
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2170
	e1000_vlan_rx_register(adapter->netdev, adapter->vlgrp);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2171
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2172
	if (!adapter->vlgrp)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2173
		return;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2174
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2175
	for (vid = 0; vid < VLAN_GROUP_ARRAY_LEN; vid++) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2176
		if (!vlan_group_get_device(adapter->vlgrp, vid))
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2177
			continue;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2178
		e1000_vlan_rx_add_vid(adapter->netdev, vid);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2179
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2180
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2181
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2182
static void e1000_init_manageability(struct e1000_adapter *adapter)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2183
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2184
	struct e1000_hw *hw = &adapter->hw;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2185
	u32 manc, manc2h;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2186
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2187
	if (!(adapter->flags & FLAG_MNG_PT_ENABLED))
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2188
		return;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2189
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2190
	manc = er32(MANC);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2191
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2192
	/*
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2193
	 * enable receiving management packets to the host. this will probably
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2194
	 * generate destination unreachable messages from the host OS, but
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2195
	 * the packets will be handled on SMBUS
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2196
	 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2197
	manc |= E1000_MANC_EN_MNG2HOST;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2198
	manc2h = er32(MANC2H);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2199
#define E1000_MNG2HOST_PORT_623 (1 << 5)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2200
#define E1000_MNG2HOST_PORT_664 (1 << 6)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2201
	manc2h |= E1000_MNG2HOST_PORT_623;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2202
	manc2h |= E1000_MNG2HOST_PORT_664;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2203
	ew32(MANC2H, manc2h);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2204
	ew32(MANC, manc);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2205
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2206
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2207
/**
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2208
 * e1000_configure_tx - Configure 8254x Transmit Unit after Reset
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2209
 * @adapter: board private structure
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2210
 *
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2211
 * Configure the Tx unit of the MAC after a reset.
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2212
 **/
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2213
static void e1000_configure_tx(struct e1000_adapter *adapter)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2214
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2215
	struct e1000_hw *hw = &adapter->hw;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2216
	struct e1000_ring *tx_ring = adapter->tx_ring;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2217
	u64 tdba;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2218
	u32 tdlen, tctl, tipg, tarc;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2219
	u32 ipgr1, ipgr2;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2220
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2221
	/* Setup the HW Tx Head and Tail descriptor pointers */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2222
	tdba = tx_ring->dma;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2223
	tdlen = tx_ring->count * sizeof(struct e1000_tx_desc);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2224
	ew32(TDBAL, (tdba & DMA_BIT_MASK(32)));
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2225
	ew32(TDBAH, (tdba >> 32));
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2226
	ew32(TDLEN, tdlen);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2227
	ew32(TDH, 0);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2228
	ew32(TDT, 0);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2229
	tx_ring->head = E1000_TDH;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2230
	tx_ring->tail = E1000_TDT;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2231
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2232
	/* Set the default values for the Tx Inter Packet Gap timer */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2233
	tipg = DEFAULT_82543_TIPG_IPGT_COPPER;          /*  8  */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2234
	ipgr1 = DEFAULT_82543_TIPG_IPGR1;               /*  8  */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2235
	ipgr2 = DEFAULT_82543_TIPG_IPGR2;               /*  6  */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2236
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2237
	if (adapter->flags & FLAG_TIPG_MEDIUM_FOR_80003ESLAN)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2238
		ipgr2 = DEFAULT_80003ES2LAN_TIPG_IPGR2; /*  7  */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2239
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2240
	tipg |= ipgr1 << E1000_TIPG_IPGR1_SHIFT;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2241
	tipg |= ipgr2 << E1000_TIPG_IPGR2_SHIFT;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2242
	ew32(TIPG, tipg);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2243
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2244
	/* Set the Tx Interrupt Delay register */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2245
	ew32(TIDV, adapter->tx_int_delay);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2246
	/* Tx irq moderation */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2247
	ew32(TADV, adapter->tx_abs_int_delay);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2248
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2249
	/* Program the Transmit Control Register */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2250
	tctl = er32(TCTL);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2251
	tctl &= ~E1000_TCTL_CT;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2252
	tctl |= E1000_TCTL_PSP | E1000_TCTL_RTLC |
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2253
		(E1000_COLLISION_THRESHOLD << E1000_CT_SHIFT);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2254
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2255
	if (adapter->flags & FLAG_TARC_SPEED_MODE_BIT) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2256
		tarc = er32(TARC(0));
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2257
		/*
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2258
		 * set the speed mode bit, we'll clear it if we're not at
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2259
		 * gigabit link later
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2260
		 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2261
#define SPEED_MODE_BIT (1 << 21)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2262
		tarc |= SPEED_MODE_BIT;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2263
		ew32(TARC(0), tarc);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2264
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2265
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2266
	/* errata: program both queues to unweighted RR */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2267
	if (adapter->flags & FLAG_TARC_SET_BIT_ZERO) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2268
		tarc = er32(TARC(0));
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2269
		tarc |= 1;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2270
		ew32(TARC(0), tarc);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2271
		tarc = er32(TARC(1));
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2272
		tarc |= 1;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2273
		ew32(TARC(1), tarc);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2274
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2275
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2276
	/* Setup Transmit Descriptor Settings for eop descriptor */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2277
	adapter->txd_cmd = E1000_TXD_CMD_EOP | E1000_TXD_CMD_IFCS;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2278
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2279
	/* only set IDE if we are delaying interrupts using the timers */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2280
	if (adapter->tx_int_delay)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2281
		adapter->txd_cmd |= E1000_TXD_CMD_IDE;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2282
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2283
	/* enable Report Status bit */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2284
	adapter->txd_cmd |= E1000_TXD_CMD_RS;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2285
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2286
	ew32(TCTL, tctl);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2287
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2288
	e1000e_config_collision_dist(hw);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2289
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2290
	adapter->tx_queue_len = adapter->netdev->tx_queue_len;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2291
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2292
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2293
/**
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2294
 * e1000_setup_rctl - configure the receive control registers
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2295
 * @adapter: Board private structure
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2296
 **/
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2297
#define PAGE_USE_COUNT(S) (((S) >> PAGE_SHIFT) + \
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2298
			   (((S) & (PAGE_SIZE - 1)) ? 1 : 0))
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2299
static void e1000_setup_rctl(struct e1000_adapter *adapter)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2300
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2301
	struct e1000_hw *hw = &adapter->hw;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2302
	u32 rctl, rfctl;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2303
	u32 psrctl = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2304
	u32 pages = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2305
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2306
	/* Program MC offset vector base */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2307
	rctl = er32(RCTL);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2308
	rctl &= ~(3 << E1000_RCTL_MO_SHIFT);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2309
	rctl |= E1000_RCTL_EN | E1000_RCTL_BAM |
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2310
		E1000_RCTL_LBM_NO | E1000_RCTL_RDMTS_HALF |
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2311
		(adapter->hw.mac.mc_filter_type << E1000_RCTL_MO_SHIFT);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2312
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2313
	/* Do not Store bad packets */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2314
	rctl &= ~E1000_RCTL_SBP;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2315
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2316
	/* Enable Long Packet receive */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2317
	if (adapter->netdev->mtu <= ETH_DATA_LEN)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2318
		rctl &= ~E1000_RCTL_LPE;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2319
	else
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2320
		rctl |= E1000_RCTL_LPE;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2321
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2322
	/* Some systems expect that the CRC is included in SMBUS traffic. The
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2323
	 * hardware strips the CRC before sending to both SMBUS (BMC) and to
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2324
	 * host memory when this is enabled
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2325
	 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2326
	if (adapter->flags2 & FLAG2_CRC_STRIPPING)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2327
		rctl |= E1000_RCTL_SECRC;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2328
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2329
	/* Workaround Si errata on 82577 PHY - configure IPG for jumbos */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2330
	if ((hw->phy.type == e1000_phy_82577) && (rctl & E1000_RCTL_LPE)) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2331
		u16 phy_data;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2332
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2333
		e1e_rphy(hw, PHY_REG(770, 26), &phy_data);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2334
		phy_data &= 0xfff8;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2335
		phy_data |= (1 << 2);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2336
		e1e_wphy(hw, PHY_REG(770, 26), phy_data);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2337
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2338
		e1e_rphy(hw, 22, &phy_data);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2339
		phy_data &= 0x0fff;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2340
		phy_data |= (1 << 14);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2341
		e1e_wphy(hw, 0x10, 0x2823);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2342
		e1e_wphy(hw, 0x11, 0x0003);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2343
		e1e_wphy(hw, 22, phy_data);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2344
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2345
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2346
	/* Setup buffer sizes */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2347
	rctl &= ~E1000_RCTL_SZ_4096;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2348
	rctl |= E1000_RCTL_BSEX;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2349
	switch (adapter->rx_buffer_len) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2350
	case 2048:
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2351
	default:
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2352
		rctl |= E1000_RCTL_SZ_2048;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2353
		rctl &= ~E1000_RCTL_BSEX;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2354
		break;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2355
	case 4096:
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2356
		rctl |= E1000_RCTL_SZ_4096;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2357
		break;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2358
	case 8192:
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2359
		rctl |= E1000_RCTL_SZ_8192;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2360
		break;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2361
	case 16384:
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2362
		rctl |= E1000_RCTL_SZ_16384;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2363
		break;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2364
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2365
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2366
	/*
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2367
	 * 82571 and greater support packet-split where the protocol
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2368
	 * header is placed in skb->data and the packet data is
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2369
	 * placed in pages hanging off of skb_shinfo(skb)->nr_frags.
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2370
	 * In the case of a non-split, skb->data is linearly filled,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2371
	 * followed by the page buffers.  Therefore, skb->data is
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2372
	 * sized to hold the largest protocol header.
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2373
	 *
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2374
	 * allocations using alloc_page take too long for regular MTU
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2375
	 * so only enable packet split for jumbo frames
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2376
	 *
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2377
	 * Using pages when the page size is greater than 16k wastes
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2378
	 * a lot of memory, since we allocate 3 pages at all times
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2379
	 * per packet.
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2380
	 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2381
	pages = PAGE_USE_COUNT(adapter->netdev->mtu);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2382
	if (!(adapter->flags & FLAG_IS_ICH) && (pages <= 3) &&
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2383
	    (PAGE_SIZE <= 16384) && (rctl & E1000_RCTL_LPE))
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2384
		adapter->rx_ps_pages = pages;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2385
	else
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2386
		adapter->rx_ps_pages = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2387
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2388
	if (adapter->rx_ps_pages) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2389
		/* Configure extra packet-split registers */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2390
		rfctl = er32(RFCTL);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2391
		rfctl |= E1000_RFCTL_EXTEN;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2392
		/*
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2393
		 * disable packet split support for IPv6 extension headers,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2394
		 * because some malformed IPv6 headers can hang the Rx
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2395
		 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2396
		rfctl |= (E1000_RFCTL_IPV6_EX_DIS |
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2397
			  E1000_RFCTL_NEW_IPV6_EXT_DIS);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2398
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2399
		ew32(RFCTL, rfctl);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2400
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2401
		/* Enable Packet split descriptors */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2402
		rctl |= E1000_RCTL_DTYP_PS;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2403
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2404
		psrctl |= adapter->rx_ps_bsize0 >>
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2405
			E1000_PSRCTL_BSIZE0_SHIFT;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2406
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2407
		switch (adapter->rx_ps_pages) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2408
		case 3:
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2409
			psrctl |= PAGE_SIZE <<
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2410
				E1000_PSRCTL_BSIZE3_SHIFT;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2411
		case 2:
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2412
			psrctl |= PAGE_SIZE <<
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2413
				E1000_PSRCTL_BSIZE2_SHIFT;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2414
		case 1:
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2415
			psrctl |= PAGE_SIZE >>
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2416
				E1000_PSRCTL_BSIZE1_SHIFT;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2417
			break;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2418
		}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2419
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2420
		ew32(PSRCTL, psrctl);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2421
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2422
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2423
	ew32(RCTL, rctl);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2424
	/* just started the receive unit, no need to restart */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2425
	adapter->flags &= ~FLAG_RX_RESTART_NOW;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2426
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2427
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2428
/**
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2429
 * e1000_configure_rx - Configure Receive Unit after Reset
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2430
 * @adapter: board private structure
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2431
 *
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2432
 * Configure the Rx unit of the MAC after a reset.
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2433
 **/
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2434
static void e1000_configure_rx(struct e1000_adapter *adapter)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2435
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2436
	struct e1000_hw *hw = &adapter->hw;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2437
	struct e1000_ring *rx_ring = adapter->rx_ring;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2438
	u64 rdba;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2439
	u32 rdlen, rctl, rxcsum, ctrl_ext;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2440
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2441
	if (adapter->rx_ps_pages) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2442
		/* this is a 32 byte descriptor */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2443
		rdlen = rx_ring->count *
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2444
			sizeof(union e1000_rx_desc_packet_split);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2445
		adapter->clean_rx = e1000_clean_rx_irq_ps;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2446
		adapter->alloc_rx_buf = e1000_alloc_rx_buffers_ps;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2447
	} else if (adapter->netdev->mtu > ETH_FRAME_LEN + ETH_FCS_LEN) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2448
		rdlen = rx_ring->count * sizeof(struct e1000_rx_desc);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2449
		adapter->clean_rx = e1000_clean_jumbo_rx_irq;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2450
		adapter->alloc_rx_buf = e1000_alloc_jumbo_rx_buffers;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2451
	} else {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2452
		rdlen = rx_ring->count * sizeof(struct e1000_rx_desc);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2453
		adapter->clean_rx = e1000_clean_rx_irq;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2454
		adapter->alloc_rx_buf = e1000_alloc_rx_buffers;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2455
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2456
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2457
	/* disable receives while setting up the descriptors */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2458
	rctl = er32(RCTL);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2459
	ew32(RCTL, rctl & ~E1000_RCTL_EN);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2460
	e1e_flush();
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2461
	msleep(10);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2462
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2463
	/* set the Receive Delay Timer Register */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2464
	ew32(RDTR, adapter->rx_int_delay);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2465
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2466
	/* irq moderation */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2467
	ew32(RADV, adapter->rx_abs_int_delay);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2468
	if (adapter->itr_setting != 0)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2469
		ew32(ITR, 1000000000 / (adapter->itr * 256));
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2470
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2471
	ctrl_ext = er32(CTRL_EXT);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2472
	/* Reset delay timers after every interrupt */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2473
	ctrl_ext |= E1000_CTRL_EXT_INT_TIMER_CLR;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2474
	/* Auto-Mask interrupts upon ICR access */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2475
	ctrl_ext |= E1000_CTRL_EXT_IAME;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2476
	ew32(IAM, 0xffffffff);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2477
	ew32(CTRL_EXT, ctrl_ext);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2478
	e1e_flush();
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2479
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2480
	/*
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2481
	 * Setup the HW Rx Head and Tail Descriptor Pointers and
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2482
	 * the Base and Length of the Rx Descriptor Ring
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2483
	 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2484
	rdba = rx_ring->dma;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2485
	ew32(RDBAL, (rdba & DMA_BIT_MASK(32)));
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2486
	ew32(RDBAH, (rdba >> 32));
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2487
	ew32(RDLEN, rdlen);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2488
	ew32(RDH, 0);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2489
	ew32(RDT, 0);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2490
	rx_ring->head = E1000_RDH;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2491
	rx_ring->tail = E1000_RDT;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2492
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2493
	/* Enable Receive Checksum Offload for TCP and UDP */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2494
	rxcsum = er32(RXCSUM);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2495
	if (adapter->flags & FLAG_RX_CSUM_ENABLED) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2496
		rxcsum |= E1000_RXCSUM_TUOFL;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2497
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2498
		/*
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2499
		 * IPv4 payload checksum for UDP fragments must be
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2500
		 * used in conjunction with packet-split.
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2501
		 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2502
		if (adapter->rx_ps_pages)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2503
			rxcsum |= E1000_RXCSUM_IPPCSE;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2504
	} else {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2505
		rxcsum &= ~E1000_RXCSUM_TUOFL;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2506
		/* no need to clear IPPCSE as it defaults to 0 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2507
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2508
	ew32(RXCSUM, rxcsum);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2509
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2510
	/*
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2511
	 * Enable early receives on supported devices, only takes effect when
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2512
	 * packet size is equal or larger than the specified value (in 8 byte
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2513
	 * units), e.g. using jumbo frames when setting to E1000_ERT_2048
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2514
	 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2515
	if ((adapter->flags & FLAG_HAS_ERT) &&
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2516
	    (adapter->netdev->mtu > ETH_DATA_LEN)) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2517
		u32 rxdctl = er32(RXDCTL(0));
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2518
		ew32(RXDCTL(0), rxdctl | 0x3);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2519
		ew32(ERT, E1000_ERT_2048 | (1 << 13));
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2520
		/*
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2521
		 * With jumbo frames and early-receive enabled, excessive
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2522
		 * C4->C2 latencies result in dropped transactions.
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2523
		 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2524
		pm_qos_update_requirement(PM_QOS_CPU_DMA_LATENCY,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2525
					  e1000e_driver_name, 55);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2526
	} else {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2527
		pm_qos_update_requirement(PM_QOS_CPU_DMA_LATENCY,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2528
					  e1000e_driver_name,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2529
					  PM_QOS_DEFAULT_VALUE);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2530
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2531
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2532
	/* Enable Receives */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2533
	ew32(RCTL, rctl);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2534
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2535
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2536
/**
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2537
 *  e1000_update_mc_addr_list - Update Multicast addresses
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2538
 *  @hw: pointer to the HW structure
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2539
 *  @mc_addr_list: array of multicast addresses to program
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2540
 *  @mc_addr_count: number of multicast addresses to program
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2541
 *  @rar_used_count: the first RAR register free to program
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2542
 *  @rar_count: total number of supported Receive Address Registers
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2543
 *
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2544
 *  Updates the Receive Address Registers and Multicast Table Array.
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2545
 *  The caller must have a packed mc_addr_list of multicast addresses.
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2546
 *  The parameter rar_count will usually be hw->mac.rar_entry_count
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2547
 *  unless there are workarounds that change this.  Currently no func pointer
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2548
 *  exists and all implementations are handled in the generic version of this
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2549
 *  function.
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2550
 **/
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2551
static void e1000_update_mc_addr_list(struct e1000_hw *hw, u8 *mc_addr_list,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2552
				      u32 mc_addr_count, u32 rar_used_count,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2553
				      u32 rar_count)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2554
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2555
	hw->mac.ops.update_mc_addr_list(hw, mc_addr_list, mc_addr_count,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2556
				        rar_used_count, rar_count);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2557
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2558
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2559
/**
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2560
 * e1000_set_multi - Multicast and Promiscuous mode set
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2561
 * @netdev: network interface device structure
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2562
 *
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2563
 * The set_multi entry point is called whenever the multicast address
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2564
 * list or the network interface flags are updated.  This routine is
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2565
 * responsible for configuring the hardware for proper multicast,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2566
 * promiscuous mode, and all-multi behavior.
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2567
 **/
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2568
static void e1000_set_multi(struct net_device *netdev)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2569
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2570
	struct e1000_adapter *adapter = netdev_priv(netdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2571
	struct e1000_hw *hw = &adapter->hw;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2572
	struct e1000_mac_info *mac = &hw->mac;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2573
	struct dev_mc_list *mc_ptr;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2574
	u8  *mta_list;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2575
	u32 rctl;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2576
	int i;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2577
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2578
	/* Check for Promiscuous and All Multicast modes */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2579
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2580
	rctl = er32(RCTL);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2581
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2582
	if (netdev->flags & IFF_PROMISC) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2583
		rctl |= (E1000_RCTL_UPE | E1000_RCTL_MPE);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2584
		rctl &= ~E1000_RCTL_VFE;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2585
	} else {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2586
		if (netdev->flags & IFF_ALLMULTI) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2587
			rctl |= E1000_RCTL_MPE;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2588
			rctl &= ~E1000_RCTL_UPE;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2589
		} else {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2590
			rctl &= ~(E1000_RCTL_UPE | E1000_RCTL_MPE);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2591
		}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2592
		if (adapter->flags & FLAG_HAS_HW_VLAN_FILTER)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2593
			rctl |= E1000_RCTL_VFE;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2594
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2595
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2596
	ew32(RCTL, rctl);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2597
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2598
	if (netdev->mc_count) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2599
		mta_list = kmalloc(netdev->mc_count * 6, GFP_ATOMIC);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2600
		if (!mta_list)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2601
			return;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2602
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2603
		/* prepare a packed array of only addresses. */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2604
		mc_ptr = netdev->mc_list;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2605
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2606
		for (i = 0; i < netdev->mc_count; i++) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2607
			if (!mc_ptr)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2608
				break;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2609
			memcpy(mta_list + (i*ETH_ALEN), mc_ptr->dmi_addr,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2610
			       ETH_ALEN);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2611
			mc_ptr = mc_ptr->next;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2612
		}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2613
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2614
		e1000_update_mc_addr_list(hw, mta_list, i, 1,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2615
					  mac->rar_entry_count);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2616
		kfree(mta_list);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2617
	} else {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2618
		/*
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2619
		 * if we're called from probe, we might not have
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2620
		 * anything to do here, so clear out the list
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2621
		 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2622
		e1000_update_mc_addr_list(hw, NULL, 0, 1, mac->rar_entry_count);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2623
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2624
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2625
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2626
/**
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2627
 * e1000_configure - configure the hardware for Rx and Tx
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2628
 * @adapter: private board structure
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2629
 **/
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2630
static void e1000_configure(struct e1000_adapter *adapter)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2631
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2632
	e1000_set_multi(adapter->netdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2633
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2634
	e1000_restore_vlan(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2635
	e1000_init_manageability(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2636
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2637
	e1000_configure_tx(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2638
	e1000_setup_rctl(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2639
	e1000_configure_rx(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2640
	adapter->alloc_rx_buf(adapter, e1000_desc_unused(adapter->rx_ring));
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2641
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2642
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2643
/**
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2644
 * e1000e_power_up_phy - restore link in case the phy was powered down
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2645
 * @adapter: address of board private structure
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2646
 *
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2647
 * The phy may be powered down to save power and turn off link when the
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2648
 * driver is unloaded and wake on lan is not enabled (among others)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2649
 * *** this routine MUST be followed by a call to e1000e_reset ***
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2650
 **/
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2651
void e1000e_power_up_phy(struct e1000_adapter *adapter)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2652
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2653
	u16 mii_reg = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2654
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2655
	/* Just clear the power down bit to wake the phy back up */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2656
	if (adapter->hw.phy.media_type == e1000_media_type_copper) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2657
		/*
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2658
		 * According to the manual, the phy will retain its
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2659
		 * settings across a power-down/up cycle
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2660
		 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2661
		e1e_rphy(&adapter->hw, PHY_CONTROL, &mii_reg);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2662
		mii_reg &= ~MII_CR_POWER_DOWN;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2663
		e1e_wphy(&adapter->hw, PHY_CONTROL, mii_reg);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2664
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2665
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2666
	adapter->hw.mac.ops.setup_link(&adapter->hw);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2667
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2668
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2669
/**
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2670
 * e1000_power_down_phy - Power down the PHY
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2671
 *
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2672
 * Power down the PHY so no link is implied when interface is down
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2673
 * The PHY cannot be powered down is management or WoL is active
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2674
 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2675
static void e1000_power_down_phy(struct e1000_adapter *adapter)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2676
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2677
	struct e1000_hw *hw = &adapter->hw;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2678
	u16 mii_reg;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2679
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2680
	/* WoL is enabled */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2681
	if (adapter->wol)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2682
		return;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2683
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2684
	/* non-copper PHY? */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2685
	if (adapter->hw.phy.media_type != e1000_media_type_copper)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2686
		return;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2687
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2688
	/* reset is blocked because of a SoL/IDER session */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2689
	if (e1000e_check_mng_mode(hw) || e1000_check_reset_block(hw))
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2690
		return;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2691
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2692
	/* manageability (AMT) is enabled */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2693
	if (er32(MANC) & E1000_MANC_SMBUS_EN)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2694
		return;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2695
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2696
	/* power down the PHY */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2697
	e1e_rphy(hw, PHY_CONTROL, &mii_reg);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2698
	mii_reg |= MII_CR_POWER_DOWN;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2699
	e1e_wphy(hw, PHY_CONTROL, mii_reg);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2700
	mdelay(1);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2701
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2702
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2703
/**
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2704
 * e1000e_reset - bring the hardware into a known good state
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2705
 *
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2706
 * This function boots the hardware and enables some settings that
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2707
 * require a configuration cycle of the hardware - those cannot be
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2708
 * set/changed during runtime. After reset the device needs to be
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2709
 * properly configured for Rx, Tx etc.
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2710
 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2711
void e1000e_reset(struct e1000_adapter *adapter)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2712
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2713
	struct e1000_mac_info *mac = &adapter->hw.mac;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2714
	struct e1000_fc_info *fc = &adapter->hw.fc;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2715
	struct e1000_hw *hw = &adapter->hw;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2716
	u32 tx_space, min_tx_space, min_rx_space;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2717
	u32 pba = adapter->pba;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2718
	u16 hwm;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2719
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2720
	/* reset Packet Buffer Allocation to default */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2721
	ew32(PBA, pba);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2722
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2723
	if (adapter->max_frame_size > ETH_FRAME_LEN + ETH_FCS_LEN) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2724
		/*
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2725
		 * To maintain wire speed transmits, the Tx FIFO should be
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2726
		 * large enough to accommodate two full transmit packets,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2727
		 * rounded up to the next 1KB and expressed in KB.  Likewise,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2728
		 * the Rx FIFO should be large enough to accommodate at least
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2729
		 * one full receive packet and is similarly rounded up and
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2730
		 * expressed in KB.
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2731
		 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2732
		pba = er32(PBA);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2733
		/* upper 16 bits has Tx packet buffer allocation size in KB */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2734
		tx_space = pba >> 16;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2735
		/* lower 16 bits has Rx packet buffer allocation size in KB */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2736
		pba &= 0xffff;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2737
		/*
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2738
		 * the Tx fifo also stores 16 bytes of information about the tx
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2739
		 * but don't include ethernet FCS because hardware appends it
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2740
		 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2741
		min_tx_space = (adapter->max_frame_size +
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2742
				sizeof(struct e1000_tx_desc) -
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2743
				ETH_FCS_LEN) * 2;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2744
		min_tx_space = ALIGN(min_tx_space, 1024);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2745
		min_tx_space >>= 10;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2746
		/* software strips receive CRC, so leave room for it */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2747
		min_rx_space = adapter->max_frame_size;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2748
		min_rx_space = ALIGN(min_rx_space, 1024);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2749
		min_rx_space >>= 10;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2750
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2751
		/*
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2752
		 * If current Tx allocation is less than the min Tx FIFO size,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2753
		 * and the min Tx FIFO size is less than the current Rx FIFO
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2754
		 * allocation, take space away from current Rx allocation
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2755
		 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2756
		if ((tx_space < min_tx_space) &&
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2757
		    ((min_tx_space - tx_space) < pba)) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2758
			pba -= min_tx_space - tx_space;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2759
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2760
			/*
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2761
			 * if short on Rx space, Rx wins and must trump tx
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2762
			 * adjustment or use Early Receive if available
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2763
			 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2764
			if ((pba < min_rx_space) &&
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2765
			    (!(adapter->flags & FLAG_HAS_ERT)))
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2766
				/* ERT enabled in e1000_configure_rx */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2767
				pba = min_rx_space;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2768
		}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2769
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2770
		ew32(PBA, pba);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2771
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2772
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2773
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2774
	/*
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2775
	 * flow control settings
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2776
	 *
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2777
	 * The high water mark must be low enough to fit one full frame
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2778
	 * (or the size used for early receive) above it in the Rx FIFO.
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2779
	 * Set it to the lower of:
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2780
	 * - 90% of the Rx FIFO size, and
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2781
	 * - the full Rx FIFO size minus the early receive size (for parts
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2782
	 *   with ERT support assuming ERT set to E1000_ERT_2048), or
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2783
	 * - the full Rx FIFO size minus one full frame
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2784
	 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2785
	if (hw->mac.type == e1000_pchlan) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2786
		/*
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2787
		 * Workaround PCH LOM adapter hangs with certain network
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2788
		 * loads.  If hangs persist, try disabling Tx flow control.
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2789
		 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2790
		if (adapter->netdev->mtu > ETH_DATA_LEN) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2791
			fc->high_water = 0x3500;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2792
			fc->low_water  = 0x1500;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2793
		} else {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2794
			fc->high_water = 0x5000;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2795
			fc->low_water  = 0x3000;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2796
		}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2797
	} else {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2798
		if ((adapter->flags & FLAG_HAS_ERT) &&
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2799
		    (adapter->netdev->mtu > ETH_DATA_LEN))
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2800
			hwm = min(((pba << 10) * 9 / 10),
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2801
				  ((pba << 10) - (E1000_ERT_2048 << 3)));
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2802
		else
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2803
			hwm = min(((pba << 10) * 9 / 10),
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2804
				  ((pba << 10) - adapter->max_frame_size));
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2805
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2806
		fc->high_water = hwm & E1000_FCRTH_RTH; /* 8-byte granularity */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2807
		fc->low_water = fc->high_water - 8;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2808
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2809
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2810
	if (adapter->flags & FLAG_DISABLE_FC_PAUSE_TIME)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2811
		fc->pause_time = 0xFFFF;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2812
	else
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2813
		fc->pause_time = E1000_FC_PAUSE_TIME;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2814
	fc->send_xon = 1;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2815
	fc->current_mode = fc->requested_mode;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2816
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2817
	/* Allow time for pending master requests to run */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2818
	mac->ops.reset_hw(hw);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2819
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2820
	/*
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2821
	 * For parts with AMT enabled, let the firmware know
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2822
	 * that the network interface is in control
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2823
	 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2824
	if (adapter->flags & FLAG_HAS_AMT)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2825
		e1000_get_hw_control(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2826
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2827
	ew32(WUC, 0);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2828
	if (adapter->flags2 & FLAG2_HAS_PHY_WAKEUP)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2829
		e1e_wphy(&adapter->hw, BM_WUC, 0);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2830
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2831
	if (mac->ops.init_hw(hw))
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2832
		e_err("Hardware Error\n");
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2833
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2834
	/* additional part of the flow-control workaround above */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2835
	if (hw->mac.type == e1000_pchlan)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2836
		ew32(FCRTV_PCH, 0x1000);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2837
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2838
	e1000_update_mng_vlan(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2839
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2840
	/* Enable h/w to recognize an 802.1Q VLAN Ethernet packet */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2841
	ew32(VET, ETH_P_8021Q);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2842
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2843
	e1000e_reset_adaptive(hw);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2844
	e1000_get_phy_info(hw);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2845
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2846
	if ((adapter->flags & FLAG_HAS_SMART_POWER_DOWN) &&
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2847
	    !(adapter->flags & FLAG_SMART_POWER_DOWN)) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2848
		u16 phy_data = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2849
		/*
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2850
		 * speed up time to link by disabling smart power down, ignore
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2851
		 * the return value of this function because there is nothing
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2852
		 * different we would do if it failed
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2853
		 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2854
		e1e_rphy(hw, IGP02E1000_PHY_POWER_MGMT, &phy_data);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2855
		phy_data &= ~IGP02E1000_PM_SPD;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2856
		e1e_wphy(hw, IGP02E1000_PHY_POWER_MGMT, phy_data);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2857
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2858
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2859
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2860
int e1000e_up(struct e1000_adapter *adapter)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2861
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2862
	struct e1000_hw *hw = &adapter->hw;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2863
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2864
	/* hardware has been reset, we need to reload some things */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2865
	e1000_configure(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2866
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2867
	clear_bit(__E1000_DOWN, &adapter->state);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2868
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2869
	napi_enable(&adapter->napi);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2870
	if (adapter->msix_entries)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2871
		e1000_configure_msix(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2872
	e1000_irq_enable(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2873
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2874
	netif_wake_queue(adapter->netdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2875
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2876
	/* fire a link change interrupt to start the watchdog */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2877
	ew32(ICS, E1000_ICS_LSC);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2878
	return 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2879
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2880
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2881
void e1000e_down(struct e1000_adapter *adapter)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2882
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2883
	struct net_device *netdev = adapter->netdev;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2884
	struct e1000_hw *hw = &adapter->hw;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2885
	u32 tctl, rctl;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2886
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2887
	/*
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2888
	 * signal that we're down so the interrupt handler does not
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2889
	 * reschedule our watchdog timer
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2890
	 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2891
	set_bit(__E1000_DOWN, &adapter->state);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2892
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2893
	/* disable receives in the hardware */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2894
	rctl = er32(RCTL);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2895
	ew32(RCTL, rctl & ~E1000_RCTL_EN);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2896
	/* flush and sleep below */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2897
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2898
	netif_stop_queue(netdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2899
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2900
	/* disable transmits in the hardware */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2901
	tctl = er32(TCTL);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2902
	tctl &= ~E1000_TCTL_EN;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2903
	ew32(TCTL, tctl);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2904
	/* flush both disables and wait for them to finish */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2905
	e1e_flush();
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2906
	msleep(10);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2907
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2908
	napi_disable(&adapter->napi);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2909
	e1000_irq_disable(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2910
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2911
	del_timer_sync(&adapter->watchdog_timer);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2912
	del_timer_sync(&adapter->phy_info_timer);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2913
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2914
	netdev->tx_queue_len = adapter->tx_queue_len;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2915
	netif_carrier_off(netdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2916
	adapter->link_speed = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2917
	adapter->link_duplex = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2918
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2919
	if (!pci_channel_offline(adapter->pdev))
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2920
		e1000e_reset(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2921
	e1000_clean_tx_ring(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2922
	e1000_clean_rx_ring(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2923
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2924
	/*
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2925
	 * TODO: for power management, we could drop the link and
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2926
	 * pci_disable_device here.
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2927
	 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2928
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2929
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2930
void e1000e_reinit_locked(struct e1000_adapter *adapter)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2931
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2932
	might_sleep();
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2933
	while (test_and_set_bit(__E1000_RESETTING, &adapter->state))
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2934
		msleep(1);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2935
	e1000e_down(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2936
	e1000e_up(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2937
	clear_bit(__E1000_RESETTING, &adapter->state);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2938
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2939
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2940
/**
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2941
 * e1000_sw_init - Initialize general software structures (struct e1000_adapter)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2942
 * @adapter: board private structure to initialize
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2943
 *
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2944
 * e1000_sw_init initializes the Adapter private data structure.
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2945
 * Fields are initialized based on PCI device information and
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2946
 * OS network device settings (MTU size).
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2947
 **/
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2948
static int __devinit e1000_sw_init(struct e1000_adapter *adapter)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2949
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2950
	struct net_device *netdev = adapter->netdev;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2951
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2952
	adapter->rx_buffer_len = ETH_FRAME_LEN + VLAN_HLEN + ETH_FCS_LEN;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2953
	adapter->rx_ps_bsize0 = 128;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2954
	adapter->max_frame_size = netdev->mtu + ETH_HLEN + ETH_FCS_LEN;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2955
	adapter->min_frame_size = ETH_ZLEN + ETH_FCS_LEN;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2956
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2957
	e1000e_set_interrupt_capability(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2958
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2959
	if (e1000_alloc_queues(adapter))
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2960
		return -ENOMEM;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2961
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2962
	/* Explicitly disable IRQ since the NIC can be in any state. */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2963
	e1000_irq_disable(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2964
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2965
	set_bit(__E1000_DOWN, &adapter->state);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2966
	return 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2967
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2968
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2969
/**
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2970
 * e1000_intr_msi_test - Interrupt Handler
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2971
 * @irq: interrupt number
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2972
 * @data: pointer to a network interface device structure
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2973
 **/
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2974
static irqreturn_t e1000_intr_msi_test(int irq, void *data)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2975
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2976
	struct net_device *netdev = data;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2977
	struct e1000_adapter *adapter = netdev_priv(netdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2978
	struct e1000_hw *hw = &adapter->hw;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2979
	u32 icr = er32(ICR);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2980
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2981
	e_dbg("%s: icr is %08X\n", netdev->name, icr);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2982
	if (icr & E1000_ICR_RXSEQ) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2983
		adapter->flags &= ~FLAG_MSI_TEST_FAILED;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2984
		wmb();
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2985
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2986
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2987
	return IRQ_HANDLED;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2988
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2989
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2990
/**
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2991
 * e1000_test_msi_interrupt - Returns 0 for successful test
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2992
 * @adapter: board private struct
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2993
 *
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2994
 * code flow taken from tg3.c
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2995
 **/
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2996
static int e1000_test_msi_interrupt(struct e1000_adapter *adapter)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2997
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2998
	struct net_device *netdev = adapter->netdev;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2999
	struct e1000_hw *hw = &adapter->hw;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3000
	int err;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3001
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3002
	/* poll_enable hasn't been called yet, so don't need disable */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3003
	/* clear any pending events */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3004
	er32(ICR);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3005
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3006
	/* free the real vector and request a test handler */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3007
	e1000_free_irq(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3008
	e1000e_reset_interrupt_capability(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3009
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3010
	/* Assume that the test fails, if it succeeds then the test
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3011
	 * MSI irq handler will unset this flag */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3012
	adapter->flags |= FLAG_MSI_TEST_FAILED;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3013
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3014
	err = pci_enable_msi(adapter->pdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3015
	if (err)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3016
		goto msi_test_failed;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3017
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3018
	err = request_irq(adapter->pdev->irq, &e1000_intr_msi_test, 0,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3019
			  netdev->name, netdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3020
	if (err) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3021
		pci_disable_msi(adapter->pdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3022
		goto msi_test_failed;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3023
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3024
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3025
	wmb();
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3026
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3027
	e1000_irq_enable(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3028
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3029
	/* fire an unusual interrupt on the test handler */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3030
	ew32(ICS, E1000_ICS_RXSEQ);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3031
	e1e_flush();
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3032
	msleep(50);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3033
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3034
	e1000_irq_disable(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3035
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3036
	rmb();
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3037
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3038
	if (adapter->flags & FLAG_MSI_TEST_FAILED) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3039
		adapter->int_mode = E1000E_INT_MODE_LEGACY;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3040
		err = -EIO;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3041
		e_info("MSI interrupt test failed!\n");
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3042
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3043
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3044
	free_irq(adapter->pdev->irq, netdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3045
	pci_disable_msi(adapter->pdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3046
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3047
	if (err == -EIO)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3048
		goto msi_test_failed;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3049
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3050
	/* okay so the test worked, restore settings */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3051
	e_dbg("%s: MSI interrupt test succeeded!\n", netdev->name);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3052
msi_test_failed:
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3053
	e1000e_set_interrupt_capability(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3054
	e1000_request_irq(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3055
	return err;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3056
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3057
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3058
/**
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3059
 * e1000_test_msi - Returns 0 if MSI test succeeds or INTx mode is restored
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3060
 * @adapter: board private struct
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3061
 *
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3062
 * code flow taken from tg3.c, called with e1000 interrupts disabled.
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3063
 **/
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3064
static int e1000_test_msi(struct e1000_adapter *adapter)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3065
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3066
	int err;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3067
	u16 pci_cmd;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3068
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3069
	if (!(adapter->flags & FLAG_MSI_ENABLED))
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3070
		return 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3071
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3072
	/* disable SERR in case the MSI write causes a master abort */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3073
	pci_read_config_word(adapter->pdev, PCI_COMMAND, &pci_cmd);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3074
	pci_write_config_word(adapter->pdev, PCI_COMMAND,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3075
			      pci_cmd & ~PCI_COMMAND_SERR);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3076
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3077
	err = e1000_test_msi_interrupt(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3078
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3079
	/* restore previous setting of command word */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3080
	pci_write_config_word(adapter->pdev, PCI_COMMAND, pci_cmd);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3081
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3082
	/* success ! */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3083
	if (!err)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3084
		return 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3085
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3086
	/* EIO means MSI test failed */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3087
	if (err != -EIO)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3088
		return err;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3089
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3090
	/* back to INTx mode */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3091
	e_warn("MSI interrupt test failed, using legacy interrupt.\n");
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3092
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3093
	e1000_free_irq(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3094
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3095
	err = e1000_request_irq(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3096
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3097
	return err;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3098
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3099
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3100
/**
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3101
 * e1000_open - Called when a network interface is made active
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3102
 * @netdev: network interface device structure
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3103
 *
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3104
 * Returns 0 on success, negative value on failure
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3105
 *
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3106
 * The open entry point is called when a network interface is made
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3107
 * active by the system (IFF_UP).  At this point all resources needed
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3108
 * for transmit and receive operations are allocated, the interrupt
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3109
 * handler is registered with the OS, the watchdog timer is started,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3110
 * and the stack is notified that the interface is ready.
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3111
 **/
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3112
static int e1000_open(struct net_device *netdev)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3113
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3114
	struct e1000_adapter *adapter = netdev_priv(netdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3115
	struct e1000_hw *hw = &adapter->hw;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3116
	int err;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3117
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3118
	/* disallow open during test */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3119
	if (test_bit(__E1000_TESTING, &adapter->state))
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3120
		return -EBUSY;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3121
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3122
	netif_carrier_off(netdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3123
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3124
	/* allocate transmit descriptors */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3125
	err = e1000e_setup_tx_resources(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3126
	if (err)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3127
		goto err_setup_tx;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3128
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3129
	/* allocate receive descriptors */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3130
	err = e1000e_setup_rx_resources(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3131
	if (err)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3132
		goto err_setup_rx;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3133
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3134
	e1000e_power_up_phy(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3135
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3136
	adapter->mng_vlan_id = E1000_MNG_VLAN_NONE;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3137
	if ((adapter->hw.mng_cookie.status &
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3138
	     E1000_MNG_DHCP_COOKIE_STATUS_VLAN))
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3139
		e1000_update_mng_vlan(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3140
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3141
	/*
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3142
	 * If AMT is enabled, let the firmware know that the network
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3143
	 * interface is now open
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3144
	 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3145
	if (adapter->flags & FLAG_HAS_AMT)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3146
		e1000_get_hw_control(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3147
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3148
	/*
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3149
	 * before we allocate an interrupt, we must be ready to handle it.
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3150
	 * Setting DEBUG_SHIRQ in the kernel makes it fire an interrupt
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3151
	 * as soon as we call pci_request_irq, so we have to setup our
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3152
	 * clean_rx handler before we do so.
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3153
	 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3154
	e1000_configure(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3155
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3156
	err = e1000_request_irq(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3157
	if (err)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3158
		goto err_req_irq;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3159
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3160
	/*
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3161
	 * Work around PCIe errata with MSI interrupts causing some chipsets to
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3162
	 * ignore e1000e MSI messages, which means we need to test our MSI
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3163
	 * interrupt now
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3164
	 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3165
	if (adapter->int_mode != E1000E_INT_MODE_LEGACY) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3166
		err = e1000_test_msi(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3167
		if (err) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3168
			e_err("Interrupt allocation failed\n");
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3169
			goto err_req_irq;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3170
		}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3171
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3172
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3173
	/* From here on the code is the same as e1000e_up() */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3174
	clear_bit(__E1000_DOWN, &adapter->state);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3175
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3176
	napi_enable(&adapter->napi);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3177
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3178
	e1000_irq_enable(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3179
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3180
	netif_start_queue(netdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3181
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3182
	/* fire a link status change interrupt to start the watchdog */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3183
	ew32(ICS, E1000_ICS_LSC);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3184
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3185
	return 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3186
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3187
err_req_irq:
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3188
	e1000_release_hw_control(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3189
	e1000_power_down_phy(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3190
	e1000e_free_rx_resources(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3191
err_setup_rx:
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3192
	e1000e_free_tx_resources(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3193
err_setup_tx:
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3194
	e1000e_reset(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3195
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3196
	return err;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3197
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3198
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3199
/**
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3200
 * e1000_close - Disables a network interface
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3201
 * @netdev: network interface device structure
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3202
 *
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3203
 * Returns 0, this is not allowed to fail
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3204
 *
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3205
 * The close entry point is called when an interface is de-activated
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3206
 * by the OS.  The hardware is still under the drivers control, but
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3207
 * needs to be disabled.  A global MAC reset is issued to stop the
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3208
 * hardware, and all transmit and receive resources are freed.
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3209
 **/
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3210
static int e1000_close(struct net_device *netdev)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3211
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3212
	struct e1000_adapter *adapter = netdev_priv(netdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3213
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3214
	WARN_ON(test_bit(__E1000_RESETTING, &adapter->state));
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3215
	e1000e_down(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3216
	e1000_power_down_phy(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3217
	e1000_free_irq(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3218
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3219
	e1000e_free_tx_resources(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3220
	e1000e_free_rx_resources(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3221
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3222
	/*
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3223
	 * kill manageability vlan ID if supported, but not if a vlan with
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3224
	 * the same ID is registered on the host OS (let 8021q kill it)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3225
	 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3226
	if ((adapter->hw.mng_cookie.status &
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3227
			  E1000_MNG_DHCP_COOKIE_STATUS_VLAN) &&
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3228
	     !(adapter->vlgrp &&
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3229
	       vlan_group_get_device(adapter->vlgrp, adapter->mng_vlan_id)))
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3230
		e1000_vlan_rx_kill_vid(netdev, adapter->mng_vlan_id);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3231
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3232
	/*
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3233
	 * If AMT is enabled, let the firmware know that the network
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3234
	 * interface is now closed
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3235
	 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3236
	if (adapter->flags & FLAG_HAS_AMT)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3237
		e1000_release_hw_control(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3238
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3239
	return 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3240
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3241
/**
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3242
 * e1000_set_mac - Change the Ethernet Address of the NIC
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3243
 * @netdev: network interface device structure
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3244
 * @p: pointer to an address structure
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3245
 *
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3246
 * Returns 0 on success, negative on failure
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3247
 **/
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3248
static int e1000_set_mac(struct net_device *netdev, void *p)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3249
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3250
	struct e1000_adapter *adapter = netdev_priv(netdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3251
	struct sockaddr *addr = p;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3252
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3253
	if (!is_valid_ether_addr(addr->sa_data))
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3254
		return -EADDRNOTAVAIL;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3255
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3256
	memcpy(netdev->dev_addr, addr->sa_data, netdev->addr_len);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3257
	memcpy(adapter->hw.mac.addr, addr->sa_data, netdev->addr_len);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3258
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3259
	e1000e_rar_set(&adapter->hw, adapter->hw.mac.addr, 0);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3260
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3261
	if (adapter->flags & FLAG_RESET_OVERWRITES_LAA) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3262
		/* activate the work around */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3263
		e1000e_set_laa_state_82571(&adapter->hw, 1);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3264
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3265
		/*
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3266
		 * Hold a copy of the LAA in RAR[14] This is done so that
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3267
		 * between the time RAR[0] gets clobbered  and the time it
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3268
		 * gets fixed (in e1000_watchdog), the actual LAA is in one
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3269
		 * of the RARs and no incoming packets directed to this port
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3270
		 * are dropped. Eventually the LAA will be in RAR[0] and
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3271
		 * RAR[14]
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3272
		 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3273
		e1000e_rar_set(&adapter->hw,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3274
			      adapter->hw.mac.addr,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3275
			      adapter->hw.mac.rar_entry_count - 1);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3276
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3277
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3278
	return 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3279
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3280
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3281
/**
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3282
 * e1000e_update_phy_task - work thread to update phy
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3283
 * @work: pointer to our work struct
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3284
 *
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3285
 * this worker thread exists because we must acquire a
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3286
 * semaphore to read the phy, which we could msleep while
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3287
 * waiting for it, and we can't msleep in a timer.
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3288
 **/
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3289
static void e1000e_update_phy_task(struct work_struct *work)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3290
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3291
	struct e1000_adapter *adapter = container_of(work,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3292
					struct e1000_adapter, update_phy_task);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3293
	e1000_get_phy_info(&adapter->hw);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3294
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3295
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3296
/*
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3297
 * Need to wait a few seconds after link up to get diagnostic information from
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3298
 * the phy
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3299
 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3300
static void e1000_update_phy_info(unsigned long data)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3301
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3302
	struct e1000_adapter *adapter = (struct e1000_adapter *) data;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3303
	schedule_work(&adapter->update_phy_task);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3304
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3305
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3306
/**
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3307
 * e1000e_update_stats - Update the board statistics counters
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3308
 * @adapter: board private structure
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3309
 **/
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3310
void e1000e_update_stats(struct e1000_adapter *adapter)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3311
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3312
	struct e1000_hw *hw = &adapter->hw;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3313
	struct pci_dev *pdev = adapter->pdev;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3314
	u16 phy_data;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3315
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3316
	/*
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3317
	 * Prevent stats update while adapter is being reset, or if the pci
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3318
	 * connection is down.
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3319
	 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3320
	if (adapter->link_speed == 0)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3321
		return;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3322
	if (pci_channel_offline(pdev))
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3323
		return;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3324
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3325
	adapter->stats.crcerrs += er32(CRCERRS);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3326
	adapter->stats.gprc += er32(GPRC);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3327
	adapter->stats.gorc += er32(GORCL);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3328
	er32(GORCH); /* Clear gorc */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3329
	adapter->stats.bprc += er32(BPRC);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3330
	adapter->stats.mprc += er32(MPRC);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3331
	adapter->stats.roc += er32(ROC);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3332
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3333
	adapter->stats.mpc += er32(MPC);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3334
	if ((hw->phy.type == e1000_phy_82578) ||
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3335
	    (hw->phy.type == e1000_phy_82577)) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3336
		e1e_rphy(hw, HV_SCC_UPPER, &phy_data);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3337
		e1e_rphy(hw, HV_SCC_LOWER, &phy_data);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3338
		adapter->stats.scc += phy_data;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3339
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3340
		e1e_rphy(hw, HV_ECOL_UPPER, &phy_data);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3341
		e1e_rphy(hw, HV_ECOL_LOWER, &phy_data);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3342
		adapter->stats.ecol += phy_data;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3343
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3344
		e1e_rphy(hw, HV_MCC_UPPER, &phy_data);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3345
		e1e_rphy(hw, HV_MCC_LOWER, &phy_data);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3346
		adapter->stats.mcc += phy_data;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3347
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3348
		e1e_rphy(hw, HV_LATECOL_UPPER, &phy_data);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3349
		e1e_rphy(hw, HV_LATECOL_LOWER, &phy_data);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3350
		adapter->stats.latecol += phy_data;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3351
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3352
		e1e_rphy(hw, HV_DC_UPPER, &phy_data);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3353
		e1e_rphy(hw, HV_DC_LOWER, &phy_data);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3354
		adapter->stats.dc += phy_data;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3355
	} else {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3356
		adapter->stats.scc += er32(SCC);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3357
		adapter->stats.ecol += er32(ECOL);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3358
		adapter->stats.mcc += er32(MCC);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3359
		adapter->stats.latecol += er32(LATECOL);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3360
		adapter->stats.dc += er32(DC);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3361
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3362
	adapter->stats.xonrxc += er32(XONRXC);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3363
	adapter->stats.xontxc += er32(XONTXC);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3364
	adapter->stats.xoffrxc += er32(XOFFRXC);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3365
	adapter->stats.xofftxc += er32(XOFFTXC);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3366
	adapter->stats.gptc += er32(GPTC);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3367
	adapter->stats.gotc += er32(GOTCL);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3368
	er32(GOTCH); /* Clear gotc */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3369
	adapter->stats.rnbc += er32(RNBC);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3370
	adapter->stats.ruc += er32(RUC);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3371
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3372
	adapter->stats.mptc += er32(MPTC);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3373
	adapter->stats.bptc += er32(BPTC);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3374
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3375
	/* used for adaptive IFS */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3376
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3377
	hw->mac.tx_packet_delta = er32(TPT);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3378
	adapter->stats.tpt += hw->mac.tx_packet_delta;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3379
	if ((hw->phy.type == e1000_phy_82578) ||
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3380
	    (hw->phy.type == e1000_phy_82577)) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3381
		e1e_rphy(hw, HV_COLC_UPPER, &phy_data);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3382
		e1e_rphy(hw, HV_COLC_LOWER, &phy_data);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3383
		hw->mac.collision_delta = phy_data;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3384
	} else {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3385
		hw->mac.collision_delta = er32(COLC);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3386
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3387
	adapter->stats.colc += hw->mac.collision_delta;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3388
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3389
	adapter->stats.algnerrc += er32(ALGNERRC);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3390
	adapter->stats.rxerrc += er32(RXERRC);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3391
	if ((hw->phy.type == e1000_phy_82578) ||
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3392
	    (hw->phy.type == e1000_phy_82577)) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3393
		e1e_rphy(hw, HV_TNCRS_UPPER, &phy_data);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3394
		e1e_rphy(hw, HV_TNCRS_LOWER, &phy_data);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3395
		adapter->stats.tncrs += phy_data;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3396
	} else {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3397
		if ((hw->mac.type != e1000_82574) &&
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3398
		    (hw->mac.type != e1000_82583))
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3399
			adapter->stats.tncrs += er32(TNCRS);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3400
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3401
	adapter->stats.cexterr += er32(CEXTERR);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3402
	adapter->stats.tsctc += er32(TSCTC);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3403
	adapter->stats.tsctfc += er32(TSCTFC);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3404
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3405
	/* Fill out the OS statistics structure */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3406
	adapter->net_stats.multicast = adapter->stats.mprc;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3407
	adapter->net_stats.collisions = adapter->stats.colc;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3408
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3409
	/* Rx Errors */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3410
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3411
	/*
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3412
	 * RLEC on some newer hardware can be incorrect so build
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3413
	 * our own version based on RUC and ROC
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3414
	 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3415
	adapter->net_stats.rx_errors = adapter->stats.rxerrc +
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3416
		adapter->stats.crcerrs + adapter->stats.algnerrc +
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3417
		adapter->stats.ruc + adapter->stats.roc +
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3418
		adapter->stats.cexterr;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3419
	adapter->net_stats.rx_length_errors = adapter->stats.ruc +
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3420
					      adapter->stats.roc;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3421
	adapter->net_stats.rx_crc_errors = adapter->stats.crcerrs;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3422
	adapter->net_stats.rx_frame_errors = adapter->stats.algnerrc;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3423
	adapter->net_stats.rx_missed_errors = adapter->stats.mpc;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3424
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3425
	/* Tx Errors */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3426
	adapter->net_stats.tx_errors = adapter->stats.ecol +
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3427
				       adapter->stats.latecol;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3428
	adapter->net_stats.tx_aborted_errors = adapter->stats.ecol;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3429
	adapter->net_stats.tx_window_errors = adapter->stats.latecol;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3430
	adapter->net_stats.tx_carrier_errors = adapter->stats.tncrs;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3431
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3432
	/* Tx Dropped needs to be maintained elsewhere */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3433
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3434
	/* Management Stats */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3435
	adapter->stats.mgptc += er32(MGTPTC);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3436
	adapter->stats.mgprc += er32(MGTPRC);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3437
	adapter->stats.mgpdc += er32(MGTPDC);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3438
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3439
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3440
/**
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3441
 * e1000_phy_read_status - Update the PHY register status snapshot
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3442
 * @adapter: board private structure
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3443
 **/
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3444
static void e1000_phy_read_status(struct e1000_adapter *adapter)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3445
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3446
	struct e1000_hw *hw = &adapter->hw;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3447
	struct e1000_phy_regs *phy = &adapter->phy_regs;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3448
	int ret_val;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3449
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3450
	if ((er32(STATUS) & E1000_STATUS_LU) &&
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3451
	    (adapter->hw.phy.media_type == e1000_media_type_copper)) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3452
		ret_val  = e1e_rphy(hw, PHY_CONTROL, &phy->bmcr);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3453
		ret_val |= e1e_rphy(hw, PHY_STATUS, &phy->bmsr);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3454
		ret_val |= e1e_rphy(hw, PHY_AUTONEG_ADV, &phy->advertise);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3455
		ret_val |= e1e_rphy(hw, PHY_LP_ABILITY, &phy->lpa);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3456
		ret_val |= e1e_rphy(hw, PHY_AUTONEG_EXP, &phy->expansion);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3457
		ret_val |= e1e_rphy(hw, PHY_1000T_CTRL, &phy->ctrl1000);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3458
		ret_val |= e1e_rphy(hw, PHY_1000T_STATUS, &phy->stat1000);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3459
		ret_val |= e1e_rphy(hw, PHY_EXT_STATUS, &phy->estatus);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3460
		if (ret_val)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3461
			e_warn("Error reading PHY register\n");
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3462
	} else {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3463
		/*
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3464
		 * Do not read PHY registers if link is not up
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3465
		 * Set values to typical power-on defaults
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3466
		 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3467
		phy->bmcr = (BMCR_SPEED1000 | BMCR_ANENABLE | BMCR_FULLDPLX);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3468
		phy->bmsr = (BMSR_100FULL | BMSR_100HALF | BMSR_10FULL |
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3469
			     BMSR_10HALF | BMSR_ESTATEN | BMSR_ANEGCAPABLE |
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3470
			     BMSR_ERCAP);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3471
		phy->advertise = (ADVERTISE_PAUSE_ASYM | ADVERTISE_PAUSE_CAP |
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3472
				  ADVERTISE_ALL | ADVERTISE_CSMA);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3473
		phy->lpa = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3474
		phy->expansion = EXPANSION_ENABLENPAGE;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3475
		phy->ctrl1000 = ADVERTISE_1000FULL;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3476
		phy->stat1000 = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3477
		phy->estatus = (ESTATUS_1000_TFULL | ESTATUS_1000_THALF);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3478
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3479
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3480
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3481
static void e1000_print_link_info(struct e1000_adapter *adapter)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3482
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3483
	struct e1000_hw *hw = &adapter->hw;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3484
	u32 ctrl = er32(CTRL);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3485
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3486
	/* Link status message must follow this format for user tools */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3487
	printk(KERN_INFO "e1000e: %s NIC Link is Up %d Mbps %s, "
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3488
	       "Flow Control: %s\n",
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3489
	       adapter->netdev->name,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3490
	       adapter->link_speed,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3491
	       (adapter->link_duplex == FULL_DUPLEX) ?
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3492
	                        "Full Duplex" : "Half Duplex",
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3493
	       ((ctrl & E1000_CTRL_TFCE) && (ctrl & E1000_CTRL_RFCE)) ?
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3494
	                        "RX/TX" :
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3495
	       ((ctrl & E1000_CTRL_RFCE) ? "RX" :
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3496
	       ((ctrl & E1000_CTRL_TFCE) ? "TX" : "None" )));
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3497
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3498
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3499
bool e1000_has_link(struct e1000_adapter *adapter)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3500
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3501
	struct e1000_hw *hw = &adapter->hw;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3502
	bool link_active = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3503
	s32 ret_val = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3504
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3505
	/*
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3506
	 * get_link_status is set on LSC (link status) interrupt or
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3507
	 * Rx sequence error interrupt.  get_link_status will stay
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3508
	 * false until the check_for_link establishes link
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3509
	 * for copper adapters ONLY
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3510
	 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3511
	switch (hw->phy.media_type) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3512
	case e1000_media_type_copper:
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3513
		if (hw->mac.get_link_status) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3514
			ret_val = hw->mac.ops.check_for_link(hw);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3515
			link_active = !hw->mac.get_link_status;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3516
		} else {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3517
			link_active = 1;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3518
		}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3519
		break;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3520
	case e1000_media_type_fiber:
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3521
		ret_val = hw->mac.ops.check_for_link(hw);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3522
		link_active = !!(er32(STATUS) & E1000_STATUS_LU);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3523
		break;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3524
	case e1000_media_type_internal_serdes:
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3525
		ret_val = hw->mac.ops.check_for_link(hw);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3526
		link_active = adapter->hw.mac.serdes_has_link;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3527
		break;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3528
	default:
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3529
	case e1000_media_type_unknown:
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3530
		break;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3531
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3532
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3533
	if ((ret_val == E1000_ERR_PHY) && (hw->phy.type == e1000_phy_igp_3) &&
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3534
	    (er32(CTRL) & E1000_PHY_CTRL_GBE_DISABLE)) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3535
		/* See e1000_kmrn_lock_loss_workaround_ich8lan() */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3536
		e_info("Gigabit has been disabled, downgrading speed\n");
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3537
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3538
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3539
	return link_active;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3540
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3541
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3542
static void e1000e_enable_receives(struct e1000_adapter *adapter)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3543
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3544
	/* make sure the receive unit is started */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3545
	if ((adapter->flags & FLAG_RX_NEEDS_RESTART) &&
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3546
	    (adapter->flags & FLAG_RX_RESTART_NOW)) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3547
		struct e1000_hw *hw = &adapter->hw;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3548
		u32 rctl = er32(RCTL);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3549
		ew32(RCTL, rctl | E1000_RCTL_EN);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3550
		adapter->flags &= ~FLAG_RX_RESTART_NOW;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3551
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3552
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3553
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3554
/**
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3555
 * e1000_watchdog - Timer Call-back
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3556
 * @data: pointer to adapter cast into an unsigned long
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3557
 **/
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3558
static void e1000_watchdog(unsigned long data)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3559
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3560
	struct e1000_adapter *adapter = (struct e1000_adapter *) data;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3561
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3562
	/* Do the rest outside of interrupt context */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3563
	schedule_work(&adapter->watchdog_task);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3564
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3565
	/* TODO: make this use queue_delayed_work() */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3566
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3567
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3568
static void e1000_watchdog_task(struct work_struct *work)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3569
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3570
	struct e1000_adapter *adapter = container_of(work,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3571
					struct e1000_adapter, watchdog_task);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3572
	struct net_device *netdev = adapter->netdev;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3573
	struct e1000_mac_info *mac = &adapter->hw.mac;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3574
	struct e1000_phy_info *phy = &adapter->hw.phy;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3575
	struct e1000_ring *tx_ring = adapter->tx_ring;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3576
	struct e1000_hw *hw = &adapter->hw;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3577
	u32 link, tctl;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3578
	int tx_pending = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3579
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3580
	link = e1000_has_link(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3581
	if ((netif_carrier_ok(netdev)) && link) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3582
		e1000e_enable_receives(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3583
		goto link_up;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3584
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3585
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3586
	if ((e1000e_enable_tx_pkt_filtering(hw)) &&
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3587
	    (adapter->mng_vlan_id != adapter->hw.mng_cookie.vlan_id))
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3588
		e1000_update_mng_vlan(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3589
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3590
	if (link) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3591
		if (!netif_carrier_ok(netdev)) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3592
			bool txb2b = 1;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3593
			/* update snapshot of PHY registers on LSC */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3594
			e1000_phy_read_status(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3595
			mac->ops.get_link_up_info(&adapter->hw,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3596
						   &adapter->link_speed,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3597
						   &adapter->link_duplex);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3598
			e1000_print_link_info(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3599
			/*
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3600
			 * On supported PHYs, check for duplex mismatch only
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3601
			 * if link has autonegotiated at 10/100 half
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3602
			 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3603
			if ((hw->phy.type == e1000_phy_igp_3 ||
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3604
			     hw->phy.type == e1000_phy_bm) &&
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3605
			    (hw->mac.autoneg == true) &&
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3606
			    (adapter->link_speed == SPEED_10 ||
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3607
			     adapter->link_speed == SPEED_100) &&
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3608
			    (adapter->link_duplex == HALF_DUPLEX)) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3609
				u16 autoneg_exp;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3610
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3611
				e1e_rphy(hw, PHY_AUTONEG_EXP, &autoneg_exp);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3612
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3613
				if (!(autoneg_exp & NWAY_ER_LP_NWAY_CAPS))
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3614
					e_info("Autonegotiated half duplex but"
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3615
					       " link partner cannot autoneg. "
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3616
					       " Try forcing full duplex if "
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3617
					       "link gets many collisions.\n");
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3618
			}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3619
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3620
			/*
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3621
			 * tweak tx_queue_len according to speed/duplex
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3622
			 * and adjust the timeout factor
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3623
			 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3624
			netdev->tx_queue_len = adapter->tx_queue_len;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3625
			adapter->tx_timeout_factor = 1;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3626
			switch (adapter->link_speed) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3627
			case SPEED_10:
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3628
				txb2b = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3629
				netdev->tx_queue_len = 10;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3630
				adapter->tx_timeout_factor = 16;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3631
				break;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3632
			case SPEED_100:
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3633
				txb2b = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3634
				netdev->tx_queue_len = 100;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3635
				adapter->tx_timeout_factor = 10;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3636
				break;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3637
			}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3638
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3639
			/*
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3640
			 * workaround: re-program speed mode bit after
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3641
			 * link-up event
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3642
			 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3643
			if ((adapter->flags & FLAG_TARC_SPEED_MODE_BIT) &&
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3644
			    !txb2b) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3645
				u32 tarc0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3646
				tarc0 = er32(TARC(0));
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3647
				tarc0 &= ~SPEED_MODE_BIT;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3648
				ew32(TARC(0), tarc0);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3649
			}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3650
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3651
			/*
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3652
			 * disable TSO for pcie and 10/100 speeds, to avoid
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3653
			 * some hardware issues
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3654
			 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3655
			if (!(adapter->flags & FLAG_TSO_FORCE)) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3656
				switch (adapter->link_speed) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3657
				case SPEED_10:
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3658
				case SPEED_100:
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3659
					e_info("10/100 speed: disabling TSO\n");
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3660
					netdev->features &= ~NETIF_F_TSO;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3661
					netdev->features &= ~NETIF_F_TSO6;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3662
					break;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3663
				case SPEED_1000:
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3664
					netdev->features |= NETIF_F_TSO;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3665
					netdev->features |= NETIF_F_TSO6;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3666
					break;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3667
				default:
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3668
					/* oops */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3669
					break;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3670
				}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3671
			}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3672
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3673
			/*
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3674
			 * enable transmits in the hardware, need to do this
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3675
			 * after setting TARC(0)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3676
			 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3677
			tctl = er32(TCTL);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3678
			tctl |= E1000_TCTL_EN;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3679
			ew32(TCTL, tctl);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3680
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3681
                        /*
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3682
			 * Perform any post-link-up configuration before
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3683
			 * reporting link up.
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3684
			 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3685
			if (phy->ops.cfg_on_link_up)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3686
				phy->ops.cfg_on_link_up(hw);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3687
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3688
			netif_carrier_on(netdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3689
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3690
			if (!test_bit(__E1000_DOWN, &adapter->state))
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3691
				mod_timer(&adapter->phy_info_timer,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3692
					  round_jiffies(jiffies + 2 * HZ));
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3693
		}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3694
	} else {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3695
		if (netif_carrier_ok(netdev)) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3696
			adapter->link_speed = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3697
			adapter->link_duplex = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3698
			/* Link status message must follow this format */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3699
			printk(KERN_INFO "e1000e: %s NIC Link is Down\n",
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3700
			       adapter->netdev->name);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3701
			netif_carrier_off(netdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3702
			if (!test_bit(__E1000_DOWN, &adapter->state))
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3703
				mod_timer(&adapter->phy_info_timer,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3704
					  round_jiffies(jiffies + 2 * HZ));
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3705
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3706
			if (adapter->flags & FLAG_RX_NEEDS_RESTART)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3707
				schedule_work(&adapter->reset_task);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3708
		}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3709
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3710
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3711
link_up:
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3712
	e1000e_update_stats(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3713
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3714
	mac->tx_packet_delta = adapter->stats.tpt - adapter->tpt_old;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3715
	adapter->tpt_old = adapter->stats.tpt;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3716
	mac->collision_delta = adapter->stats.colc - adapter->colc_old;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3717
	adapter->colc_old = adapter->stats.colc;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3718
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3719
	adapter->gorc = adapter->stats.gorc - adapter->gorc_old;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3720
	adapter->gorc_old = adapter->stats.gorc;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3721
	adapter->gotc = adapter->stats.gotc - adapter->gotc_old;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3722
	adapter->gotc_old = adapter->stats.gotc;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3723
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3724
	e1000e_update_adaptive(&adapter->hw);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3725
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3726
	if (!netif_carrier_ok(netdev)) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3727
		tx_pending = (e1000_desc_unused(tx_ring) + 1 <
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3728
			       tx_ring->count);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3729
		if (tx_pending) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3730
			/*
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3731
			 * We've lost link, so the controller stops DMA,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3732
			 * but we've got queued Tx work that's never going
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3733
			 * to get done, so reset controller to flush Tx.
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3734
			 * (Do the reset outside of interrupt context).
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3735
			 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3736
			adapter->tx_timeout_count++;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3737
			schedule_work(&adapter->reset_task);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3738
			/* return immediately since reset is imminent */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3739
			return;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3740
		}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3741
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3742
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3743
	/* Cause software interrupt to ensure Rx ring is cleaned */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3744
	if (adapter->msix_entries)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3745
		ew32(ICS, adapter->rx_ring->ims_val);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3746
	else
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3747
		ew32(ICS, E1000_ICS_RXDMT0);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3748
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3749
	/* Force detection of hung controller every watchdog period */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3750
	adapter->detect_tx_hung = 1;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3751
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3752
	/*
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3753
	 * With 82571 controllers, LAA may be overwritten due to controller
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3754
	 * reset from the other port. Set the appropriate LAA in RAR[0]
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3755
	 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3756
	if (e1000e_get_laa_state_82571(hw))
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3757
		e1000e_rar_set(hw, adapter->hw.mac.addr, 0);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3758
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3759
	/* Reset the timer */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3760
	if (!test_bit(__E1000_DOWN, &adapter->state))
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3761
		mod_timer(&adapter->watchdog_timer,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3762
			  round_jiffies(jiffies + 2 * HZ));
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3763
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3764
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3765
#define E1000_TX_FLAGS_CSUM		0x00000001
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3766
#define E1000_TX_FLAGS_VLAN		0x00000002
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3767
#define E1000_TX_FLAGS_TSO		0x00000004
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3768
#define E1000_TX_FLAGS_IPV4		0x00000008
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3769
#define E1000_TX_FLAGS_VLAN_MASK	0xffff0000
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3770
#define E1000_TX_FLAGS_VLAN_SHIFT	16
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3771
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3772
static int e1000_tso(struct e1000_adapter *adapter,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3773
		     struct sk_buff *skb)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3774
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3775
	struct e1000_ring *tx_ring = adapter->tx_ring;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3776
	struct e1000_context_desc *context_desc;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3777
	struct e1000_buffer *buffer_info;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3778
	unsigned int i;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3779
	u32 cmd_length = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3780
	u16 ipcse = 0, tucse, mss;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3781
	u8 ipcss, ipcso, tucss, tucso, hdr_len;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3782
	int err;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3783
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3784
	if (skb_is_gso(skb)) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3785
		if (skb_header_cloned(skb)) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3786
			err = pskb_expand_head(skb, 0, 0, GFP_ATOMIC);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3787
			if (err)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3788
				return err;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3789
		}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3790
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3791
		hdr_len = skb_transport_offset(skb) + tcp_hdrlen(skb);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3792
		mss = skb_shinfo(skb)->gso_size;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3793
		if (skb->protocol == htons(ETH_P_IP)) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3794
			struct iphdr *iph = ip_hdr(skb);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3795
			iph->tot_len = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3796
			iph->check = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3797
			tcp_hdr(skb)->check = ~csum_tcpudp_magic(iph->saddr,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3798
								 iph->daddr, 0,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3799
								 IPPROTO_TCP,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3800
								 0);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3801
			cmd_length = E1000_TXD_CMD_IP;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3802
			ipcse = skb_transport_offset(skb) - 1;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3803
		} else if (skb_shinfo(skb)->gso_type == SKB_GSO_TCPV6) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3804
			ipv6_hdr(skb)->payload_len = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3805
			tcp_hdr(skb)->check =
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3806
				~csum_ipv6_magic(&ipv6_hdr(skb)->saddr,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3807
						 &ipv6_hdr(skb)->daddr,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3808
						 0, IPPROTO_TCP, 0);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3809
			ipcse = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3810
		}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3811
		ipcss = skb_network_offset(skb);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3812
		ipcso = (void *)&(ip_hdr(skb)->check) - (void *)skb->data;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3813
		tucss = skb_transport_offset(skb);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3814
		tucso = (void *)&(tcp_hdr(skb)->check) - (void *)skb->data;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3815
		tucse = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3816
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3817
		cmd_length |= (E1000_TXD_CMD_DEXT | E1000_TXD_CMD_TSE |
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3818
			       E1000_TXD_CMD_TCP | (skb->len - (hdr_len)));
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3819
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3820
		i = tx_ring->next_to_use;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3821
		context_desc = E1000_CONTEXT_DESC(*tx_ring, i);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3822
		buffer_info = &tx_ring->buffer_info[i];
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3823
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3824
		context_desc->lower_setup.ip_fields.ipcss  = ipcss;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3825
		context_desc->lower_setup.ip_fields.ipcso  = ipcso;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3826
		context_desc->lower_setup.ip_fields.ipcse  = cpu_to_le16(ipcse);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3827
		context_desc->upper_setup.tcp_fields.tucss = tucss;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3828
		context_desc->upper_setup.tcp_fields.tucso = tucso;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3829
		context_desc->upper_setup.tcp_fields.tucse = cpu_to_le16(tucse);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3830
		context_desc->tcp_seg_setup.fields.mss     = cpu_to_le16(mss);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3831
		context_desc->tcp_seg_setup.fields.hdr_len = hdr_len;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3832
		context_desc->cmd_and_length = cpu_to_le32(cmd_length);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3833
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3834
		buffer_info->time_stamp = jiffies;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3835
		buffer_info->next_to_watch = i;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3836
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3837
		i++;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3838
		if (i == tx_ring->count)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3839
			i = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3840
		tx_ring->next_to_use = i;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3841
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3842
		return 1;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3843
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3844
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3845
	return 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3846
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3847
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3848
static bool e1000_tx_csum(struct e1000_adapter *adapter, struct sk_buff *skb)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3849
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3850
	struct e1000_ring *tx_ring = adapter->tx_ring;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3851
	struct e1000_context_desc *context_desc;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3852
	struct e1000_buffer *buffer_info;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3853
	unsigned int i;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3854
	u8 css;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3855
	u32 cmd_len = E1000_TXD_CMD_DEXT;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3856
	__be16 protocol;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3857
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3858
	if (skb->ip_summed != CHECKSUM_PARTIAL)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3859
		return 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3860
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3861
	if (skb->protocol == cpu_to_be16(ETH_P_8021Q))
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3862
		protocol = vlan_eth_hdr(skb)->h_vlan_encapsulated_proto;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3863
	else
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3864
		protocol = skb->protocol;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3865
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3866
	switch (protocol) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3867
	case cpu_to_be16(ETH_P_IP):
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3868
		if (ip_hdr(skb)->protocol == IPPROTO_TCP)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3869
			cmd_len |= E1000_TXD_CMD_TCP;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3870
		break;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3871
	case cpu_to_be16(ETH_P_IPV6):
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3872
		/* XXX not handling all IPV6 headers */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3873
		if (ipv6_hdr(skb)->nexthdr == IPPROTO_TCP)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3874
			cmd_len |= E1000_TXD_CMD_TCP;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3875
		break;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3876
	default:
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3877
		if (unlikely(net_ratelimit()))
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3878
			e_warn("checksum_partial proto=%x!\n",
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3879
			       be16_to_cpu(protocol));
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3880
		break;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3881
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3882
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3883
	css = skb_transport_offset(skb);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3884
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3885
	i = tx_ring->next_to_use;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3886
	buffer_info = &tx_ring->buffer_info[i];
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3887
	context_desc = E1000_CONTEXT_DESC(*tx_ring, i);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3888
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3889
	context_desc->lower_setup.ip_config = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3890
	context_desc->upper_setup.tcp_fields.tucss = css;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3891
	context_desc->upper_setup.tcp_fields.tucso =
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3892
				css + skb->csum_offset;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3893
	context_desc->upper_setup.tcp_fields.tucse = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3894
	context_desc->tcp_seg_setup.data = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3895
	context_desc->cmd_and_length = cpu_to_le32(cmd_len);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3896
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3897
	buffer_info->time_stamp = jiffies;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3898
	buffer_info->next_to_watch = i;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3899
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3900
	i++;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3901
	if (i == tx_ring->count)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3902
		i = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3903
	tx_ring->next_to_use = i;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3904
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3905
	return 1;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3906
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3907
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3908
#define E1000_MAX_PER_TXD	8192
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3909
#define E1000_MAX_TXD_PWR	12
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3910
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3911
static int e1000_tx_map(struct e1000_adapter *adapter,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3912
			struct sk_buff *skb, unsigned int first,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3913
			unsigned int max_per_txd, unsigned int nr_frags,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3914
			unsigned int mss)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3915
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3916
	struct e1000_ring *tx_ring = adapter->tx_ring;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3917
	struct e1000_buffer *buffer_info;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3918
	unsigned int len = skb_headlen(skb);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3919
	unsigned int offset, size, count = 0, i;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3920
	unsigned int f;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3921
	dma_addr_t *map;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3922
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3923
	i = tx_ring->next_to_use;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3924
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3925
	if (skb_dma_map(&adapter->pdev->dev, skb, DMA_TO_DEVICE)) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3926
		dev_err(&adapter->pdev->dev, "TX DMA map failed\n");
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3927
		adapter->tx_dma_failed++;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3928
		return 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3929
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3930
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3931
	map = skb_shinfo(skb)->dma_maps;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3932
	offset = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3933
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3934
	while (len) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3935
		buffer_info = &tx_ring->buffer_info[i];
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3936
		size = min(len, max_per_txd);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3937
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3938
		buffer_info->length = size;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3939
		buffer_info->time_stamp = jiffies;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3940
		buffer_info->next_to_watch = i;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3941
		buffer_info->dma = skb_shinfo(skb)->dma_head + offset;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3942
		count++;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3943
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3944
		len -= size;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3945
		offset += size;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3946
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3947
		if (len) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3948
			i++;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3949
			if (i == tx_ring->count)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3950
				i = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3951
		}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3952
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3953
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3954
	for (f = 0; f < nr_frags; f++) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3955
		struct skb_frag_struct *frag;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3956
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3957
		frag = &skb_shinfo(skb)->frags[f];
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3958
		len = frag->size;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3959
		offset = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3960
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3961
		while (len) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3962
			i++;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3963
			if (i == tx_ring->count)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3964
				i = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3965
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3966
			buffer_info = &tx_ring->buffer_info[i];
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3967
			size = min(len, max_per_txd);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3968
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3969
			buffer_info->length = size;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3970
			buffer_info->time_stamp = jiffies;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3971
			buffer_info->next_to_watch = i;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3972
			buffer_info->dma = map[f] + offset;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3973
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3974
			len -= size;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3975
			offset += size;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3976
			count++;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3977
		}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3978
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3979
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3980
	tx_ring->buffer_info[i].skb = skb;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3981
	tx_ring->buffer_info[first].next_to_watch = i;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3982
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3983
	return count;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3984
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3985
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3986
static void e1000_tx_queue(struct e1000_adapter *adapter,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3987
			   int tx_flags, int count)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3988
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3989
	struct e1000_ring *tx_ring = adapter->tx_ring;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3990
	struct e1000_tx_desc *tx_desc = NULL;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3991
	struct e1000_buffer *buffer_info;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3992
	u32 txd_upper = 0, txd_lower = E1000_TXD_CMD_IFCS;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3993
	unsigned int i;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3994
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3995
	if (tx_flags & E1000_TX_FLAGS_TSO) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3996
		txd_lower |= E1000_TXD_CMD_DEXT | E1000_TXD_DTYP_D |
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3997
			     E1000_TXD_CMD_TSE;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3998
		txd_upper |= E1000_TXD_POPTS_TXSM << 8;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3999
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4000
		if (tx_flags & E1000_TX_FLAGS_IPV4)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4001
			txd_upper |= E1000_TXD_POPTS_IXSM << 8;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4002
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4003
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4004
	if (tx_flags & E1000_TX_FLAGS_CSUM) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4005
		txd_lower |= E1000_TXD_CMD_DEXT | E1000_TXD_DTYP_D;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4006
		txd_upper |= E1000_TXD_POPTS_TXSM << 8;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4007
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4008
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4009
	if (tx_flags & E1000_TX_FLAGS_VLAN) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4010
		txd_lower |= E1000_TXD_CMD_VLE;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4011
		txd_upper |= (tx_flags & E1000_TX_FLAGS_VLAN_MASK);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4012
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4013
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4014
	i = tx_ring->next_to_use;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4015
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4016
	while (count--) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4017
		buffer_info = &tx_ring->buffer_info[i];
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4018
		tx_desc = E1000_TX_DESC(*tx_ring, i);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4019
		tx_desc->buffer_addr = cpu_to_le64(buffer_info->dma);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4020
		tx_desc->lower.data =
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4021
			cpu_to_le32(txd_lower | buffer_info->length);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4022
		tx_desc->upper.data = cpu_to_le32(txd_upper);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4023
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4024
		i++;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4025
		if (i == tx_ring->count)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4026
			i = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4027
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4028
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4029
	tx_desc->lower.data |= cpu_to_le32(adapter->txd_cmd);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4030
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4031
	/*
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4032
	 * Force memory writes to complete before letting h/w
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4033
	 * know there are new descriptors to fetch.  (Only
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4034
	 * applicable for weak-ordered memory model archs,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4035
	 * such as IA-64).
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4036
	 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4037
	wmb();
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4038
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4039
	tx_ring->next_to_use = i;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4040
	writel(i, adapter->hw.hw_addr + tx_ring->tail);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4041
	/*
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4042
	 * we need this if more than one processor can write to our tail
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4043
	 * at a time, it synchronizes IO on IA64/Altix systems
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4044
	 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4045
	mmiowb();
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4046
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4047
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4048
#define MINIMUM_DHCP_PACKET_SIZE 282
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4049
static int e1000_transfer_dhcp_info(struct e1000_adapter *adapter,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4050
				    struct sk_buff *skb)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4051
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4052
	struct e1000_hw *hw =  &adapter->hw;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4053
	u16 length, offset;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4054
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4055
	if (vlan_tx_tag_present(skb)) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4056
		if (!((vlan_tx_tag_get(skb) == adapter->hw.mng_cookie.vlan_id)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4057
		    && (adapter->hw.mng_cookie.status &
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4058
			E1000_MNG_DHCP_COOKIE_STATUS_VLAN)))
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4059
			return 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4060
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4061
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4062
	if (skb->len <= MINIMUM_DHCP_PACKET_SIZE)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4063
		return 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4064
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4065
	if (((struct ethhdr *) skb->data)->h_proto != htons(ETH_P_IP))
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4066
		return 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4067
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4068
	{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4069
		const struct iphdr *ip = (struct iphdr *)((u8 *)skb->data+14);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4070
		struct udphdr *udp;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4071
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4072
		if (ip->protocol != IPPROTO_UDP)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4073
			return 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4074
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4075
		udp = (struct udphdr *)((u8 *)ip + (ip->ihl << 2));
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4076
		if (ntohs(udp->dest) != 67)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4077
			return 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4078
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4079
		offset = (u8 *)udp + 8 - skb->data;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4080
		length = skb->len - offset;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4081
		return e1000e_mng_write_dhcp_info(hw, (u8 *)udp + 8, length);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4082
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4083
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4084
	return 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4085
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4086
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4087
static int __e1000_maybe_stop_tx(struct net_device *netdev, int size)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4088
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4089
	struct e1000_adapter *adapter = netdev_priv(netdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4090
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4091
	netif_stop_queue(netdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4092
	/*
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4093
	 * Herbert's original patch had:
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4094
	 *  smp_mb__after_netif_stop_queue();
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4095
	 * but since that doesn't exist yet, just open code it.
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4096
	 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4097
	smp_mb();
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4098
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4099
	/*
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4100
	 * We need to check again in a case another CPU has just
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4101
	 * made room available.
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4102
	 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4103
	if (e1000_desc_unused(adapter->tx_ring) < size)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4104
		return -EBUSY;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4105
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4106
	/* A reprieve! */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4107
	netif_start_queue(netdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4108
	++adapter->restart_queue;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4109
	return 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4110
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4111
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4112
static int e1000_maybe_stop_tx(struct net_device *netdev, int size)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4113
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4114
	struct e1000_adapter *adapter = netdev_priv(netdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4115
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4116
	if (e1000_desc_unused(adapter->tx_ring) >= size)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4117
		return 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4118
	return __e1000_maybe_stop_tx(netdev, size);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4119
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4120
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4121
#define TXD_USE_COUNT(S, X) (((S) >> (X)) + 1 )
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4122
static netdev_tx_t e1000_xmit_frame(struct sk_buff *skb,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4123
				    struct net_device *netdev)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4124
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4125
	struct e1000_adapter *adapter = netdev_priv(netdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4126
	struct e1000_ring *tx_ring = adapter->tx_ring;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4127
	unsigned int first;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4128
	unsigned int max_per_txd = E1000_MAX_PER_TXD;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4129
	unsigned int max_txd_pwr = E1000_MAX_TXD_PWR;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4130
	unsigned int tx_flags = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4131
	unsigned int len = skb->len - skb->data_len;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4132
	unsigned int nr_frags;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4133
	unsigned int mss;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4134
	int count = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4135
	int tso;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4136
	unsigned int f;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4137
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4138
	if (test_bit(__E1000_DOWN, &adapter->state)) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4139
		dev_kfree_skb_any(skb);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4140
		return NETDEV_TX_OK;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4141
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4142
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4143
	if (skb->len <= 0) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4144
		dev_kfree_skb_any(skb);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4145
		return NETDEV_TX_OK;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4146
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4147
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4148
	mss = skb_shinfo(skb)->gso_size;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4149
	/*
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4150
	 * The controller does a simple calculation to
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4151
	 * make sure there is enough room in the FIFO before
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4152
	 * initiating the DMA for each buffer.  The calc is:
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4153
	 * 4 = ceil(buffer len/mss).  To make sure we don't
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4154
	 * overrun the FIFO, adjust the max buffer len if mss
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4155
	 * drops.
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4156
	 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4157
	if (mss) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4158
		u8 hdr_len;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4159
		max_per_txd = min(mss << 2, max_per_txd);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4160
		max_txd_pwr = fls(max_per_txd) - 1;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4161
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4162
		/*
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4163
		 * TSO Workaround for 82571/2/3 Controllers -- if skb->data
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4164
		 * points to just header, pull a few bytes of payload from
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4165
		 * frags into skb->data
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4166
		 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4167
		hdr_len = skb_transport_offset(skb) + tcp_hdrlen(skb);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4168
		/*
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4169
		 * we do this workaround for ES2LAN, but it is un-necessary,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4170
		 * avoiding it could save a lot of cycles
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4171
		 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4172
		if (skb->data_len && (hdr_len == len)) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4173
			unsigned int pull_size;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4174
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4175
			pull_size = min((unsigned int)4, skb->data_len);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4176
			if (!__pskb_pull_tail(skb, pull_size)) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4177
				e_err("__pskb_pull_tail failed.\n");
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4178
				dev_kfree_skb_any(skb);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4179
				return NETDEV_TX_OK;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4180
			}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4181
			len = skb->len - skb->data_len;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4182
		}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4183
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4184
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4185
	/* reserve a descriptor for the offload context */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4186
	if ((mss) || (skb->ip_summed == CHECKSUM_PARTIAL))
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4187
		count++;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4188
	count++;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4189
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4190
	count += TXD_USE_COUNT(len, max_txd_pwr);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4191
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4192
	nr_frags = skb_shinfo(skb)->nr_frags;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4193
	for (f = 0; f < nr_frags; f++)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4194
		count += TXD_USE_COUNT(skb_shinfo(skb)->frags[f].size,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4195
				       max_txd_pwr);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4196
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4197
	if (adapter->hw.mac.tx_pkt_filtering)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4198
		e1000_transfer_dhcp_info(adapter, skb);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4199
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4200
	/*
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4201
	 * need: count + 2 desc gap to keep tail from touching
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4202
	 * head, otherwise try next time
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4203
	 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4204
	if (e1000_maybe_stop_tx(netdev, count + 2))
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4205
		return NETDEV_TX_BUSY;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4206
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4207
	if (adapter->vlgrp && vlan_tx_tag_present(skb)) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4208
		tx_flags |= E1000_TX_FLAGS_VLAN;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4209
		tx_flags |= (vlan_tx_tag_get(skb) << E1000_TX_FLAGS_VLAN_SHIFT);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4210
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4211
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4212
	first = tx_ring->next_to_use;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4213
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4214
	tso = e1000_tso(adapter, skb);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4215
	if (tso < 0) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4216
		dev_kfree_skb_any(skb);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4217
		return NETDEV_TX_OK;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4218
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4219
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4220
	if (tso)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4221
		tx_flags |= E1000_TX_FLAGS_TSO;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4222
	else if (e1000_tx_csum(adapter, skb))
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4223
		tx_flags |= E1000_TX_FLAGS_CSUM;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4224
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4225
	/*
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4226
	 * Old method was to assume IPv4 packet by default if TSO was enabled.
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4227
	 * 82571 hardware supports TSO capabilities for IPv6 as well...
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4228
	 * no longer assume, we must.
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4229
	 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4230
	if (skb->protocol == htons(ETH_P_IP))
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4231
		tx_flags |= E1000_TX_FLAGS_IPV4;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4232
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4233
	/* if count is 0 then mapping error has occured */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4234
	count = e1000_tx_map(adapter, skb, first, max_per_txd, nr_frags, mss);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4235
	if (count) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4236
		e1000_tx_queue(adapter, tx_flags, count);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4237
		/* Make sure there is space in the ring for the next send. */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4238
		e1000_maybe_stop_tx(netdev, MAX_SKB_FRAGS + 2);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4239
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4240
	} else {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4241
		dev_kfree_skb_any(skb);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4242
		tx_ring->buffer_info[first].time_stamp = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4243
		tx_ring->next_to_use = first;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4244
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4245
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4246
	return NETDEV_TX_OK;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4247
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4248
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4249
/**
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4250
 * e1000_tx_timeout - Respond to a Tx Hang
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4251
 * @netdev: network interface device structure
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4252
 **/
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4253
static void e1000_tx_timeout(struct net_device *netdev)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4254
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4255
	struct e1000_adapter *adapter = netdev_priv(netdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4256
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4257
	/* Do the reset outside of interrupt context */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4258
	adapter->tx_timeout_count++;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4259
	schedule_work(&adapter->reset_task);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4260
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4261
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4262
static void e1000_reset_task(struct work_struct *work)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4263
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4264
	struct e1000_adapter *adapter;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4265
	adapter = container_of(work, struct e1000_adapter, reset_task);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4266
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4267
	e1000e_reinit_locked(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4268
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4269
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4270
/**
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4271
 * e1000_get_stats - Get System Network Statistics
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4272
 * @netdev: network interface device structure
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4273
 *
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4274
 * Returns the address of the device statistics structure.
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4275
 * The statistics are actually updated from the timer callback.
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4276
 **/
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4277
static struct net_device_stats *e1000_get_stats(struct net_device *netdev)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4278
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4279
	struct e1000_adapter *adapter = netdev_priv(netdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4280
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4281
	/* only return the current stats */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4282
	return &adapter->net_stats;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4283
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4284
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4285
/**
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4286
 * e1000_change_mtu - Change the Maximum Transfer Unit
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4287
 * @netdev: network interface device structure
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4288
 * @new_mtu: new value for maximum frame size
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4289
 *
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4290
 * Returns 0 on success, negative on failure
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4291
 **/
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4292
static int e1000_change_mtu(struct net_device *netdev, int new_mtu)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4293
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4294
	struct e1000_adapter *adapter = netdev_priv(netdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4295
	int max_frame = new_mtu + ETH_HLEN + ETH_FCS_LEN;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4296
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4297
	/* Jumbo frame support */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4298
	if ((max_frame > ETH_FRAME_LEN + ETH_FCS_LEN) &&
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4299
	    !(adapter->flags & FLAG_HAS_JUMBO_FRAMES)) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4300
		e_err("Jumbo Frames not supported.\n");
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4301
		return -EINVAL;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4302
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4303
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4304
	/* Supported frame sizes */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4305
	if ((new_mtu < ETH_ZLEN + ETH_FCS_LEN + VLAN_HLEN) ||
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4306
	    (max_frame > adapter->max_hw_frame_size)) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4307
		e_err("Unsupported MTU setting\n");
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4308
		return -EINVAL;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4309
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4310
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4311
	while (test_and_set_bit(__E1000_RESETTING, &adapter->state))
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4312
		msleep(1);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4313
	/* e1000e_down -> e1000e_reset dependent on max_frame_size & mtu */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4314
	adapter->max_frame_size = max_frame;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4315
	e_info("changing MTU from %d to %d\n", netdev->mtu, new_mtu);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4316
	netdev->mtu = new_mtu;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4317
	if (netif_running(netdev))
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4318
		e1000e_down(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4319
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4320
	/*
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4321
	 * NOTE: netdev_alloc_skb reserves 16 bytes, and typically NET_IP_ALIGN
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4322
	 * means we reserve 2 more, this pushes us to allocate from the next
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4323
	 * larger slab size.
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4324
	 * i.e. RXBUFFER_2048 --> size-4096 slab
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4325
	 * However with the new *_jumbo_rx* routines, jumbo receives will use
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4326
	 * fragmented skbs
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4327
	 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4328
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4329
	if (max_frame <= 2048)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4330
		adapter->rx_buffer_len = 2048;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4331
	else
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4332
		adapter->rx_buffer_len = 4096;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4333
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4334
	/* adjust allocation if LPE protects us, and we aren't using SBP */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4335
	if ((max_frame == ETH_FRAME_LEN + ETH_FCS_LEN) ||
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4336
	     (max_frame == ETH_FRAME_LEN + VLAN_HLEN + ETH_FCS_LEN))
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4337
		adapter->rx_buffer_len = ETH_FRAME_LEN + VLAN_HLEN
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4338
					 + ETH_FCS_LEN;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4339
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4340
	if (netif_running(netdev))
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4341
		e1000e_up(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4342
	else
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4343
		e1000e_reset(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4344
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4345
	clear_bit(__E1000_RESETTING, &adapter->state);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4346
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4347
	return 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4348
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4349
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4350
static int e1000_mii_ioctl(struct net_device *netdev, struct ifreq *ifr,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4351
			   int cmd)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4352
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4353
	struct e1000_adapter *adapter = netdev_priv(netdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4354
	struct mii_ioctl_data *data = if_mii(ifr);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4355
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4356
	if (adapter->hw.phy.media_type != e1000_media_type_copper)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4357
		return -EOPNOTSUPP;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4358
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4359
	switch (cmd) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4360
	case SIOCGMIIPHY:
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4361
		data->phy_id = adapter->hw.phy.addr;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4362
		break;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4363
	case SIOCGMIIREG:
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4364
		switch (data->reg_num & 0x1F) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4365
		case MII_BMCR:
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4366
			data->val_out = adapter->phy_regs.bmcr;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4367
			break;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4368
		case MII_BMSR:
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4369
			data->val_out = adapter->phy_regs.bmsr;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4370
			break;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4371
		case MII_PHYSID1:
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4372
			data->val_out = (adapter->hw.phy.id >> 16);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4373
			break;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4374
		case MII_PHYSID2:
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4375
			data->val_out = (adapter->hw.phy.id & 0xFFFF);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4376
			break;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4377
		case MII_ADVERTISE:
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4378
			data->val_out = adapter->phy_regs.advertise;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4379
			break;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4380
		case MII_LPA:
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4381
			data->val_out = adapter->phy_regs.lpa;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4382
			break;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4383
		case MII_EXPANSION:
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4384
			data->val_out = adapter->phy_regs.expansion;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4385
			break;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4386
		case MII_CTRL1000:
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4387
			data->val_out = adapter->phy_regs.ctrl1000;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4388
			break;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4389
		case MII_STAT1000:
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4390
			data->val_out = adapter->phy_regs.stat1000;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4391
			break;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4392
		case MII_ESTATUS:
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4393
			data->val_out = adapter->phy_regs.estatus;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4394
			break;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4395
		default:
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4396
			return -EIO;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4397
		}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4398
		break;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4399
	case SIOCSMIIREG:
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4400
	default:
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4401
		return -EOPNOTSUPP;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4402
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4403
	return 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4404
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4405
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4406
static int e1000_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4407
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4408
	switch (cmd) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4409
	case SIOCGMIIPHY:
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4410
	case SIOCGMIIREG:
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4411
	case SIOCSMIIREG:
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4412
		return e1000_mii_ioctl(netdev, ifr, cmd);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4413
	default:
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4414
		return -EOPNOTSUPP;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4415
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4416
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4417
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4418
static int e1000_init_phy_wakeup(struct e1000_adapter *adapter, u32 wufc)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4419
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4420
	struct e1000_hw *hw = &adapter->hw;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4421
	u32 i, mac_reg;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4422
	u16 phy_reg;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4423
	int retval = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4424
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4425
	/* copy MAC RARs to PHY RARs */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4426
	for (i = 0; i < adapter->hw.mac.rar_entry_count; i++) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4427
		mac_reg = er32(RAL(i));
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4428
		e1e_wphy(hw, BM_RAR_L(i), (u16)(mac_reg & 0xFFFF));
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4429
		e1e_wphy(hw, BM_RAR_M(i), (u16)((mac_reg >> 16) & 0xFFFF));
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4430
		mac_reg = er32(RAH(i));
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4431
		e1e_wphy(hw, BM_RAR_H(i), (u16)(mac_reg & 0xFFFF));
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4432
		e1e_wphy(hw, BM_RAR_CTRL(i), (u16)((mac_reg >> 16) & 0xFFFF));
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4433
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4434
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4435
	/* copy MAC MTA to PHY MTA */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4436
	for (i = 0; i < adapter->hw.mac.mta_reg_count; i++) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4437
		mac_reg = E1000_READ_REG_ARRAY(hw, E1000_MTA, i);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4438
		e1e_wphy(hw, BM_MTA(i), (u16)(mac_reg & 0xFFFF));
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4439
		e1e_wphy(hw, BM_MTA(i) + 1, (u16)((mac_reg >> 16) & 0xFFFF));
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4440
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4441
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4442
	/* configure PHY Rx Control register */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4443
	e1e_rphy(&adapter->hw, BM_RCTL, &phy_reg);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4444
	mac_reg = er32(RCTL);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4445
	if (mac_reg & E1000_RCTL_UPE)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4446
		phy_reg |= BM_RCTL_UPE;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4447
	if (mac_reg & E1000_RCTL_MPE)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4448
		phy_reg |= BM_RCTL_MPE;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4449
	phy_reg &= ~(BM_RCTL_MO_MASK);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4450
	if (mac_reg & E1000_RCTL_MO_3)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4451
		phy_reg |= (((mac_reg & E1000_RCTL_MO_3) >> E1000_RCTL_MO_SHIFT)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4452
				<< BM_RCTL_MO_SHIFT);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4453
	if (mac_reg & E1000_RCTL_BAM)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4454
		phy_reg |= BM_RCTL_BAM;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4455
	if (mac_reg & E1000_RCTL_PMCF)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4456
		phy_reg |= BM_RCTL_PMCF;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4457
	mac_reg = er32(CTRL);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4458
	if (mac_reg & E1000_CTRL_RFCE)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4459
		phy_reg |= BM_RCTL_RFCE;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4460
	e1e_wphy(&adapter->hw, BM_RCTL, phy_reg);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4461
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4462
	/* enable PHY wakeup in MAC register */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4463
	ew32(WUFC, wufc);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4464
	ew32(WUC, E1000_WUC_PHY_WAKE | E1000_WUC_PME_EN);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4465
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4466
	/* configure and enable PHY wakeup in PHY registers */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4467
	e1e_wphy(&adapter->hw, BM_WUFC, wufc);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4468
	e1e_wphy(&adapter->hw, BM_WUC, E1000_WUC_PME_EN);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4469
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4470
	/* activate PHY wakeup */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4471
	retval = hw->phy.ops.acquire_phy(hw);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4472
	if (retval) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4473
		e_err("Could not acquire PHY\n");
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4474
		return retval;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4475
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4476
	e1000e_write_phy_reg_mdic(hw, IGP01E1000_PHY_PAGE_SELECT,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4477
	                         (BM_WUC_ENABLE_PAGE << IGP_PAGE_SHIFT));
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4478
	retval = e1000e_read_phy_reg_mdic(hw, BM_WUC_ENABLE_REG, &phy_reg);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4479
	if (retval) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4480
		e_err("Could not read PHY page 769\n");
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4481
		goto out;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4482
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4483
	phy_reg |= BM_WUC_ENABLE_BIT | BM_WUC_HOST_WU_BIT;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4484
	retval = e1000e_write_phy_reg_mdic(hw, BM_WUC_ENABLE_REG, phy_reg);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4485
	if (retval)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4486
		e_err("Could not set PHY Host Wakeup bit\n");
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4487
out:
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4488
	hw->phy.ops.release_phy(hw);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4489
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4490
	return retval;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4491
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4492
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4493
static int __e1000_shutdown(struct pci_dev *pdev, bool *enable_wake)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4494
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4495
	struct net_device *netdev = pci_get_drvdata(pdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4496
	struct e1000_adapter *adapter = netdev_priv(netdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4497
	struct e1000_hw *hw = &adapter->hw;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4498
	u32 ctrl, ctrl_ext, rctl, status;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4499
	u32 wufc = adapter->wol;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4500
	int retval = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4501
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4502
	netif_device_detach(netdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4503
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4504
	if (netif_running(netdev)) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4505
		WARN_ON(test_bit(__E1000_RESETTING, &adapter->state));
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4506
		e1000e_down(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4507
		e1000_free_irq(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4508
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4509
	e1000e_reset_interrupt_capability(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4510
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4511
	retval = pci_save_state(pdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4512
	if (retval)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4513
		return retval;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4514
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4515
	status = er32(STATUS);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4516
	if (status & E1000_STATUS_LU)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4517
		wufc &= ~E1000_WUFC_LNKC;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4518
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4519
	if (wufc) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4520
		e1000_setup_rctl(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4521
		e1000_set_multi(netdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4522
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4523
		/* turn on all-multi mode if wake on multicast is enabled */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4524
		if (wufc & E1000_WUFC_MC) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4525
			rctl = er32(RCTL);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4526
			rctl |= E1000_RCTL_MPE;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4527
			ew32(RCTL, rctl);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4528
		}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4529
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4530
		ctrl = er32(CTRL);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4531
		/* advertise wake from D3Cold */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4532
		#define E1000_CTRL_ADVD3WUC 0x00100000
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4533
		/* phy power management enable */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4534
		#define E1000_CTRL_EN_PHY_PWR_MGMT 0x00200000
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4535
		ctrl |= E1000_CTRL_ADVD3WUC;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4536
		if (!(adapter->flags2 & FLAG2_HAS_PHY_WAKEUP))
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4537
			ctrl |= E1000_CTRL_EN_PHY_PWR_MGMT;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4538
		ew32(CTRL, ctrl);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4539
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4540
		if (adapter->hw.phy.media_type == e1000_media_type_fiber ||
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4541
		    adapter->hw.phy.media_type ==
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4542
		    e1000_media_type_internal_serdes) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4543
			/* keep the laser running in D3 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4544
			ctrl_ext = er32(CTRL_EXT);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4545
			ctrl_ext |= E1000_CTRL_EXT_SDP7_DATA;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4546
			ew32(CTRL_EXT, ctrl_ext);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4547
		}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4548
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4549
		if (adapter->flags & FLAG_IS_ICH)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4550
			e1000e_disable_gig_wol_ich8lan(&adapter->hw);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4551
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4552
		/* Allow time for pending master requests to run */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4553
		e1000e_disable_pcie_master(&adapter->hw);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4554
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4555
		if (adapter->flags2 & FLAG2_HAS_PHY_WAKEUP) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4556
			/* enable wakeup by the PHY */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4557
			retval = e1000_init_phy_wakeup(adapter, wufc);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4558
			if (retval)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4559
				return retval;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4560
		} else {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4561
			/* enable wakeup by the MAC */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4562
			ew32(WUFC, wufc);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4563
			ew32(WUC, E1000_WUC_PME_EN);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4564
		}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4565
	} else {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4566
		ew32(WUC, 0);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4567
		ew32(WUFC, 0);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4568
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4569
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4570
	*enable_wake = !!wufc;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4571
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4572
	/* make sure adapter isn't asleep if manageability is enabled */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4573
	if ((adapter->flags & FLAG_MNG_PT_ENABLED) ||
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4574
	    (hw->mac.ops.check_mng_mode(hw)))
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4575
		*enable_wake = true;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4576
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4577
	if (adapter->hw.phy.type == e1000_phy_igp_3)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4578
		e1000e_igp3_phy_powerdown_workaround_ich8lan(&adapter->hw);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4579
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4580
	/*
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4581
	 * Release control of h/w to f/w.  If f/w is AMT enabled, this
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4582
	 * would have already happened in close and is redundant.
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4583
	 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4584
	e1000_release_hw_control(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4585
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4586
	pci_disable_device(pdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4587
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4588
	return 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4589
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4590
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4591
static void e1000_power_off(struct pci_dev *pdev, bool sleep, bool wake)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4592
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4593
	if (sleep && wake) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4594
		pci_prepare_to_sleep(pdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4595
		return;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4596
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4597
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4598
	pci_wake_from_d3(pdev, wake);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4599
	pci_set_power_state(pdev, PCI_D3hot);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4600
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4601
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4602
static void e1000_complete_shutdown(struct pci_dev *pdev, bool sleep,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4603
                                    bool wake)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4604
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4605
	struct net_device *netdev = pci_get_drvdata(pdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4606
	struct e1000_adapter *adapter = netdev_priv(netdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4607
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4608
	/*
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4609
	 * The pci-e switch on some quad port adapters will report a
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4610
	 * correctable error when the MAC transitions from D0 to D3.  To
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4611
	 * prevent this we need to mask off the correctable errors on the
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4612
	 * downstream port of the pci-e switch.
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4613
	 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4614
	if (adapter->flags & FLAG_IS_QUAD_PORT) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4615
		struct pci_dev *us_dev = pdev->bus->self;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4616
		int pos = pci_find_capability(us_dev, PCI_CAP_ID_EXP);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4617
		u16 devctl;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4618
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4619
		pci_read_config_word(us_dev, pos + PCI_EXP_DEVCTL, &devctl);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4620
		pci_write_config_word(us_dev, pos + PCI_EXP_DEVCTL,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4621
		                      (devctl & ~PCI_EXP_DEVCTL_CERE));
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4622
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4623
		e1000_power_off(pdev, sleep, wake);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4624
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4625
		pci_write_config_word(us_dev, pos + PCI_EXP_DEVCTL, devctl);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4626
	} else {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4627
		e1000_power_off(pdev, sleep, wake);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4628
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4629
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4630
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4631
static void e1000e_disable_l1aspm(struct pci_dev *pdev)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4632
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4633
	int pos;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4634
	u16 val;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4635
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4636
	/*
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4637
	 * 82573 workaround - disable L1 ASPM on mobile chipsets
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4638
	 *
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4639
	 * L1 ASPM on various mobile (ich7) chipsets do not behave properly
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4640
	 * resulting in lost data or garbage information on the pci-e link
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4641
	 * level. This could result in (false) bad EEPROM checksum errors,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4642
	 * long ping times (up to 2s) or even a system freeze/hang.
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4643
	 *
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4644
	 * Unfortunately this feature saves about 1W power consumption when
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4645
	 * active.
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4646
	 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4647
	pos = pci_find_capability(pdev, PCI_CAP_ID_EXP);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4648
	pci_read_config_word(pdev, pos + PCI_EXP_LNKCTL, &val);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4649
	if (val & 0x2) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4650
		dev_warn(&pdev->dev, "Disabling L1 ASPM\n");
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4651
		val &= ~0x2;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4652
		pci_write_config_word(pdev, pos + PCI_EXP_LNKCTL, val);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4653
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4654
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4655
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4656
#ifdef CONFIG_PM
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4657
static int e1000_suspend(struct pci_dev *pdev, pm_message_t state)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4658
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4659
	int retval;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4660
	bool wake;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4661
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4662
	retval = __e1000_shutdown(pdev, &wake);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4663
	if (!retval)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4664
		e1000_complete_shutdown(pdev, true, wake);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4665
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4666
	return retval;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4667
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4668
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4669
static int e1000_resume(struct pci_dev *pdev)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4670
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4671
	struct net_device *netdev = pci_get_drvdata(pdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4672
	struct e1000_adapter *adapter = netdev_priv(netdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4673
	struct e1000_hw *hw = &adapter->hw;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4674
	u32 err;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4675
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4676
	pci_set_power_state(pdev, PCI_D0);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4677
	pci_restore_state(pdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4678
	e1000e_disable_l1aspm(pdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4679
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4680
	err = pci_enable_device_mem(pdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4681
	if (err) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4682
		dev_err(&pdev->dev,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4683
			"Cannot enable PCI device from suspend\n");
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4684
		return err;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4685
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4686
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4687
	pci_set_master(pdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4688
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4689
	pci_enable_wake(pdev, PCI_D3hot, 0);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4690
	pci_enable_wake(pdev, PCI_D3cold, 0);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4691
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4692
	e1000e_set_interrupt_capability(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4693
	if (netif_running(netdev)) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4694
		err = e1000_request_irq(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4695
		if (err)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4696
			return err;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4697
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4698
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4699
	e1000e_power_up_phy(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4700
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4701
	/* report the system wakeup cause from S3/S4 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4702
	if (adapter->flags2 & FLAG2_HAS_PHY_WAKEUP) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4703
		u16 phy_data;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4704
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4705
		e1e_rphy(&adapter->hw, BM_WUS, &phy_data);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4706
		if (phy_data) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4707
			e_info("PHY Wakeup cause - %s\n",
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4708
				phy_data & E1000_WUS_EX ? "Unicast Packet" :
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4709
				phy_data & E1000_WUS_MC ? "Multicast Packet" :
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4710
				phy_data & E1000_WUS_BC ? "Broadcast Packet" :
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4711
				phy_data & E1000_WUS_MAG ? "Magic Packet" :
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4712
				phy_data & E1000_WUS_LNKC ? "Link Status "
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4713
				" Change" : "other");
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4714
		}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4715
		e1e_wphy(&adapter->hw, BM_WUS, ~0);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4716
	} else {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4717
		u32 wus = er32(WUS);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4718
		if (wus) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4719
			e_info("MAC Wakeup cause - %s\n",
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4720
				wus & E1000_WUS_EX ? "Unicast Packet" :
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4721
				wus & E1000_WUS_MC ? "Multicast Packet" :
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4722
				wus & E1000_WUS_BC ? "Broadcast Packet" :
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4723
				wus & E1000_WUS_MAG ? "Magic Packet" :
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4724
				wus & E1000_WUS_LNKC ? "Link Status Change" :
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4725
				"other");
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4726
		}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4727
		ew32(WUS, ~0);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4728
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4729
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4730
	e1000e_reset(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4731
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4732
	e1000_init_manageability(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4733
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4734
	if (netif_running(netdev))
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4735
		e1000e_up(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4736
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4737
	netif_device_attach(netdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4738
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4739
	/*
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4740
	 * If the controller has AMT, do not set DRV_LOAD until the interface
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4741
	 * is up.  For all other cases, let the f/w know that the h/w is now
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4742
	 * under the control of the driver.
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4743
	 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4744
	if (!(adapter->flags & FLAG_HAS_AMT))
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4745
		e1000_get_hw_control(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4746
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4747
	return 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4748
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4749
#endif
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4750
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4751
static void e1000_shutdown(struct pci_dev *pdev)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4752
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4753
	bool wake = false;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4754
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4755
	__e1000_shutdown(pdev, &wake);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4756
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4757
	if (system_state == SYSTEM_POWER_OFF)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4758
		e1000_complete_shutdown(pdev, false, wake);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4759
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4760
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4761
#ifdef CONFIG_NET_POLL_CONTROLLER
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4762
/*
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4763
 * Polling 'interrupt' - used by things like netconsole to send skbs
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4764
 * without having to re-enable interrupts. It's not called while
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4765
 * the interrupt routine is executing.
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4766
 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4767
static void e1000_netpoll(struct net_device *netdev)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4768
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4769
	struct e1000_adapter *adapter = netdev_priv(netdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4770
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4771
	disable_irq(adapter->pdev->irq);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4772
	e1000_intr(adapter->pdev->irq, netdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4773
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4774
	enable_irq(adapter->pdev->irq);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4775
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4776
#endif
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4777
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4778
/**
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4779
 * e1000_io_error_detected - called when PCI error is detected
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4780
 * @pdev: Pointer to PCI device
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4781
 * @state: The current pci connection state
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4782
 *
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4783
 * This function is called after a PCI bus error affecting
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4784
 * this device has been detected.
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4785
 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4786
static pci_ers_result_t e1000_io_error_detected(struct pci_dev *pdev,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4787
						pci_channel_state_t state)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4788
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4789
	struct net_device *netdev = pci_get_drvdata(pdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4790
	struct e1000_adapter *adapter = netdev_priv(netdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4791
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4792
	netif_device_detach(netdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4793
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4794
	if (state == pci_channel_io_perm_failure)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4795
		return PCI_ERS_RESULT_DISCONNECT;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4796
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4797
	if (netif_running(netdev))
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4798
		e1000e_down(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4799
	pci_disable_device(pdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4800
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4801
	/* Request a slot slot reset. */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4802
	return PCI_ERS_RESULT_NEED_RESET;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4803
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4804
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4805
/**
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4806
 * e1000_io_slot_reset - called after the pci bus has been reset.
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4807
 * @pdev: Pointer to PCI device
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4808
 *
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4809
 * Restart the card from scratch, as if from a cold-boot. Implementation
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4810
 * resembles the first-half of the e1000_resume routine.
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4811
 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4812
static pci_ers_result_t e1000_io_slot_reset(struct pci_dev *pdev)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4813
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4814
	struct net_device *netdev = pci_get_drvdata(pdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4815
	struct e1000_adapter *adapter = netdev_priv(netdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4816
	struct e1000_hw *hw = &adapter->hw;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4817
	int err;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4818
	pci_ers_result_t result;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4819
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4820
	e1000e_disable_l1aspm(pdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4821
	err = pci_enable_device_mem(pdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4822
	if (err) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4823
		dev_err(&pdev->dev,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4824
			"Cannot re-enable PCI device after reset.\n");
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4825
		result = PCI_ERS_RESULT_DISCONNECT;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4826
	} else {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4827
		pci_set_master(pdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4828
		pci_restore_state(pdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4829
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4830
		pci_enable_wake(pdev, PCI_D3hot, 0);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4831
		pci_enable_wake(pdev, PCI_D3cold, 0);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4832
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4833
		e1000e_reset(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4834
		ew32(WUS, ~0);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4835
		result = PCI_ERS_RESULT_RECOVERED;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4836
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4837
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4838
	pci_cleanup_aer_uncorrect_error_status(pdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4839
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4840
	return result;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4841
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4842
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4843
/**
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4844
 * e1000_io_resume - called when traffic can start flowing again.
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4845
 * @pdev: Pointer to PCI device
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4846
 *
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4847
 * This callback is called when the error recovery driver tells us that
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4848
 * its OK to resume normal operation. Implementation resembles the
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4849
 * second-half of the e1000_resume routine.
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4850
 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4851
static void e1000_io_resume(struct pci_dev *pdev)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4852
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4853
	struct net_device *netdev = pci_get_drvdata(pdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4854
	struct e1000_adapter *adapter = netdev_priv(netdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4855
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4856
	e1000_init_manageability(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4857
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4858
	if (netif_running(netdev)) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4859
		if (e1000e_up(adapter)) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4860
			dev_err(&pdev->dev,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4861
				"can't bring device back up after reset\n");
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4862
			return;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4863
		}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4864
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4865
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4866
	netif_device_attach(netdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4867
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4868
	/*
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4869
	 * If the controller has AMT, do not set DRV_LOAD until the interface
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4870
	 * is up.  For all other cases, let the f/w know that the h/w is now
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4871
	 * under the control of the driver.
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4872
	 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4873
	if (!(adapter->flags & FLAG_HAS_AMT))
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4874
		e1000_get_hw_control(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4875
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4876
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4877
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4878
static void e1000_print_device_info(struct e1000_adapter *adapter)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4879
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4880
	struct e1000_hw *hw = &adapter->hw;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4881
	struct net_device *netdev = adapter->netdev;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4882
	u32 pba_num;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4883
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4884
	/* print bus type/speed/width info */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4885
	e_info("(PCI Express:2.5GB/s:%s) %pM\n",
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4886
	       /* bus width */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4887
	       ((hw->bus.width == e1000_bus_width_pcie_x4) ? "Width x4" :
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4888
	        "Width x1"),
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4889
	       /* MAC address */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4890
	       netdev->dev_addr);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4891
	e_info("Intel(R) PRO/%s Network Connection\n",
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4892
	       (hw->phy.type == e1000_phy_ife) ? "10/100" : "1000");
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4893
	e1000e_read_pba_num(hw, &pba_num);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4894
	e_info("MAC: %d, PHY: %d, PBA No: %06x-%03x\n",
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4895
	       hw->mac.type, hw->phy.type, (pba_num >> 8), (pba_num & 0xff));
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4896
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4897
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4898
static void e1000_eeprom_checks(struct e1000_adapter *adapter)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4899
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4900
	struct e1000_hw *hw = &adapter->hw;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4901
	int ret_val;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4902
	u16 buf = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4903
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4904
	if (hw->mac.type != e1000_82573)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4905
		return;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4906
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4907
	ret_val = e1000_read_nvm(hw, NVM_INIT_CONTROL2_REG, 1, &buf);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4908
	if (!ret_val && (!(le16_to_cpu(buf) & (1 << 0)))) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4909
		/* Deep Smart Power Down (DSPD) */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4910
		dev_warn(&adapter->pdev->dev,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4911
			 "Warning: detected DSPD enabled in EEPROM\n");
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4912
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4913
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4914
	ret_val = e1000_read_nvm(hw, NVM_INIT_3GIO_3, 1, &buf);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4915
	if (!ret_val && (le16_to_cpu(buf) & (3 << 2))) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4916
		/* ASPM enable */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4917
		dev_warn(&adapter->pdev->dev,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4918
			 "Warning: detected ASPM enabled in EEPROM\n");
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4919
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4920
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4921
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4922
static const struct net_device_ops e1000e_netdev_ops = {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4923
	.ndo_open		= e1000_open,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4924
	.ndo_stop		= e1000_close,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4925
	.ndo_start_xmit		= e1000_xmit_frame,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4926
	.ndo_get_stats		= e1000_get_stats,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4927
	.ndo_set_multicast_list	= e1000_set_multi,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4928
	.ndo_set_mac_address	= e1000_set_mac,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4929
	.ndo_change_mtu		= e1000_change_mtu,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4930
	.ndo_do_ioctl		= e1000_ioctl,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4931
	.ndo_tx_timeout		= e1000_tx_timeout,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4932
	.ndo_validate_addr	= eth_validate_addr,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4933
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4934
	.ndo_vlan_rx_register	= e1000_vlan_rx_register,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4935
	.ndo_vlan_rx_add_vid	= e1000_vlan_rx_add_vid,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4936
	.ndo_vlan_rx_kill_vid	= e1000_vlan_rx_kill_vid,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4937
#ifdef CONFIG_NET_POLL_CONTROLLER
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4938
	.ndo_poll_controller	= e1000_netpoll,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4939
#endif
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4940
};
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4941
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4942
/**
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4943
 * e1000_probe - Device Initialization Routine
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4944
 * @pdev: PCI device information struct
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4945
 * @ent: entry in e1000_pci_tbl
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4946
 *
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4947
 * Returns 0 on success, negative on failure
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4948
 *
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4949
 * e1000_probe initializes an adapter identified by a pci_dev structure.
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4950
 * The OS initialization, configuring of the adapter private structure,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4951
 * and a hardware reset occur.
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4952
 **/
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4953
static int __devinit e1000_probe(struct pci_dev *pdev,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4954
				 const struct pci_device_id *ent)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4955
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4956
	struct net_device *netdev;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4957
	struct e1000_adapter *adapter;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4958
	struct e1000_hw *hw;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4959
	const struct e1000_info *ei = e1000_info_tbl[ent->driver_data];
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4960
	resource_size_t mmio_start, mmio_len;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4961
	resource_size_t flash_start, flash_len;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4962
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4963
	static int cards_found;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4964
	int i, err, pci_using_dac;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4965
	u16 eeprom_data = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4966
	u16 eeprom_apme_mask = E1000_EEPROM_APME;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4967
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4968
	e1000e_disable_l1aspm(pdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4969
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4970
	err = pci_enable_device_mem(pdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4971
	if (err)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4972
		return err;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4973
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4974
	pci_using_dac = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4975
	err = pci_set_dma_mask(pdev, DMA_BIT_MASK(64));
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4976
	if (!err) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4977
		err = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64));
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4978
		if (!err)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4979
			pci_using_dac = 1;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4980
	} else {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4981
		err = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4982
		if (err) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4983
			err = pci_set_consistent_dma_mask(pdev,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4984
							  DMA_BIT_MASK(32));
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4985
			if (err) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4986
				dev_err(&pdev->dev, "No usable DMA "
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4987
					"configuration, aborting\n");
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4988
				goto err_dma;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4989
			}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4990
		}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4991
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4992
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4993
	err = pci_request_selected_regions_exclusive(pdev,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4994
	                                  pci_select_bars(pdev, IORESOURCE_MEM),
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4995
	                                  e1000e_driver_name);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4996
	if (err)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4997
		goto err_pci_reg;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4998
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4999
	/* AER (Advanced Error Reporting) hooks */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5000
	pci_enable_pcie_error_reporting(pdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5001
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5002
	pci_set_master(pdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5003
	/* PCI config space info */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5004
	err = pci_save_state(pdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5005
	if (err)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5006
		goto err_alloc_etherdev;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5007
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5008
	err = -ENOMEM;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5009
	netdev = alloc_etherdev(sizeof(struct e1000_adapter));
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5010
	if (!netdev)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5011
		goto err_alloc_etherdev;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5012
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5013
	SET_NETDEV_DEV(netdev, &pdev->dev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5014
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5015
	pci_set_drvdata(pdev, netdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5016
	adapter = netdev_priv(netdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5017
	hw = &adapter->hw;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5018
	adapter->netdev = netdev;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5019
	adapter->pdev = pdev;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5020
	adapter->ei = ei;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5021
	adapter->pba = ei->pba;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5022
	adapter->flags = ei->flags;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5023
	adapter->flags2 = ei->flags2;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5024
	adapter->hw.adapter = adapter;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5025
	adapter->hw.mac.type = ei->mac;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5026
	adapter->max_hw_frame_size = ei->max_hw_frame_size;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5027
	adapter->msg_enable = (1 << NETIF_MSG_DRV | NETIF_MSG_PROBE) - 1;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5028
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5029
	mmio_start = pci_resource_start(pdev, 0);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5030
	mmio_len = pci_resource_len(pdev, 0);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5031
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5032
	err = -EIO;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5033
	adapter->hw.hw_addr = ioremap(mmio_start, mmio_len);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5034
	if (!adapter->hw.hw_addr)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5035
		goto err_ioremap;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5036
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5037
	if ((adapter->flags & FLAG_HAS_FLASH) &&
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5038
	    (pci_resource_flags(pdev, 1) & IORESOURCE_MEM)) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5039
		flash_start = pci_resource_start(pdev, 1);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5040
		flash_len = pci_resource_len(pdev, 1);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5041
		adapter->hw.flash_address = ioremap(flash_start, flash_len);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5042
		if (!adapter->hw.flash_address)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5043
			goto err_flashmap;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5044
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5045
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5046
	/* construct the net_device struct */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5047
	netdev->netdev_ops		= &e1000e_netdev_ops;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5048
	e1000e_set_ethtool_ops(netdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5049
	netdev->watchdog_timeo		= 5 * HZ;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5050
	netif_napi_add(netdev, &adapter->napi, e1000_clean, 64);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5051
	strncpy(netdev->name, pci_name(pdev), sizeof(netdev->name) - 1);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5052
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5053
	netdev->mem_start = mmio_start;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5054
	netdev->mem_end = mmio_start + mmio_len;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5055
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5056
	adapter->bd_number = cards_found++;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5057
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5058
	e1000e_check_options(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5059
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5060
	/* setup adapter struct */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5061
	err = e1000_sw_init(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5062
	if (err)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5063
		goto err_sw_init;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5064
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5065
	err = -EIO;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5066
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5067
	memcpy(&hw->mac.ops, ei->mac_ops, sizeof(hw->mac.ops));
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5068
	memcpy(&hw->nvm.ops, ei->nvm_ops, sizeof(hw->nvm.ops));
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5069
	memcpy(&hw->phy.ops, ei->phy_ops, sizeof(hw->phy.ops));
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5070
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5071
	err = ei->get_variants(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5072
	if (err)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5073
		goto err_hw_init;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5074
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5075
	if ((adapter->flags & FLAG_IS_ICH) &&
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5076
	    (adapter->flags & FLAG_READ_ONLY_NVM))
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5077
		e1000e_write_protect_nvm_ich8lan(&adapter->hw);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5078
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5079
	hw->mac.ops.get_bus_info(&adapter->hw);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5080
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5081
	adapter->hw.phy.autoneg_wait_to_complete = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5082
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5083
	/* Copper options */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5084
	if (adapter->hw.phy.media_type == e1000_media_type_copper) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5085
		adapter->hw.phy.mdix = AUTO_ALL_MODES;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5086
		adapter->hw.phy.disable_polarity_correction = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5087
		adapter->hw.phy.ms_type = e1000_ms_hw_default;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5088
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5089
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5090
	if (e1000_check_reset_block(&adapter->hw))
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5091
		e_info("PHY reset is blocked due to SOL/IDER session.\n");
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5092
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5093
	netdev->features = NETIF_F_SG |
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5094
			   NETIF_F_HW_CSUM |
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5095
			   NETIF_F_HW_VLAN_TX |
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5096
			   NETIF_F_HW_VLAN_RX;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5097
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5098
	if (adapter->flags & FLAG_HAS_HW_VLAN_FILTER)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5099
		netdev->features |= NETIF_F_HW_VLAN_FILTER;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5100
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5101
	netdev->features |= NETIF_F_TSO;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5102
	netdev->features |= NETIF_F_TSO6;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5103
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5104
	netdev->vlan_features |= NETIF_F_TSO;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5105
	netdev->vlan_features |= NETIF_F_TSO6;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5106
	netdev->vlan_features |= NETIF_F_HW_CSUM;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5107
	netdev->vlan_features |= NETIF_F_SG;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5108
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5109
	if (pci_using_dac)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5110
		netdev->features |= NETIF_F_HIGHDMA;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5111
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5112
	if (e1000e_enable_mng_pass_thru(&adapter->hw))
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5113
		adapter->flags |= FLAG_MNG_PT_ENABLED;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5114
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5115
	/*
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5116
	 * before reading the NVM, reset the controller to
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5117
	 * put the device in a known good starting state
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5118
	 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5119
	adapter->hw.mac.ops.reset_hw(&adapter->hw);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5120
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5121
	/*
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5122
	 * systems with ASPM and others may see the checksum fail on the first
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5123
	 * attempt. Let's give it a few tries
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5124
	 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5125
	for (i = 0;; i++) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5126
		if (e1000_validate_nvm_checksum(&adapter->hw) >= 0)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5127
			break;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5128
		if (i == 2) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5129
			e_err("The NVM Checksum Is Not Valid\n");
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5130
			err = -EIO;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5131
			goto err_eeprom;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5132
		}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5133
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5134
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5135
	e1000_eeprom_checks(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5136
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5137
	/* copy the MAC address out of the NVM */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5138
	if (e1000e_read_mac_addr(&adapter->hw))
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5139
		e_err("NVM Read Error while reading MAC address\n");
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5140
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5141
	memcpy(netdev->dev_addr, adapter->hw.mac.addr, netdev->addr_len);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5142
	memcpy(netdev->perm_addr, adapter->hw.mac.addr, netdev->addr_len);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5143
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5144
	if (!is_valid_ether_addr(netdev->perm_addr)) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5145
		e_err("Invalid MAC Address: %pM\n", netdev->perm_addr);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5146
		err = -EIO;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5147
		goto err_eeprom;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5148
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5149
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5150
	init_timer(&adapter->watchdog_timer);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5151
	adapter->watchdog_timer.function = &e1000_watchdog;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5152
	adapter->watchdog_timer.data = (unsigned long) adapter;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5153
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5154
	init_timer(&adapter->phy_info_timer);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5155
	adapter->phy_info_timer.function = &e1000_update_phy_info;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5156
	adapter->phy_info_timer.data = (unsigned long) adapter;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5157
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5158
	INIT_WORK(&adapter->reset_task, e1000_reset_task);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5159
	INIT_WORK(&adapter->watchdog_task, e1000_watchdog_task);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5160
	INIT_WORK(&adapter->downshift_task, e1000e_downshift_workaround);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5161
	INIT_WORK(&adapter->update_phy_task, e1000e_update_phy_task);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5162
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5163
	/* Initialize link parameters. User can change them with ethtool */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5164
	adapter->hw.mac.autoneg = 1;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5165
	adapter->fc_autoneg = 1;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5166
	adapter->hw.fc.requested_mode = e1000_fc_default;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5167
	adapter->hw.fc.current_mode = e1000_fc_default;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5168
	adapter->hw.phy.autoneg_advertised = 0x2f;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5169
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5170
	/* ring size defaults */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5171
	adapter->rx_ring->count = 256;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5172
	adapter->tx_ring->count = 256;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5173
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5174
	/*
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5175
	 * Initial Wake on LAN setting - If APM wake is enabled in
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5176
	 * the EEPROM, enable the ACPI Magic Packet filter
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5177
	 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5178
	if (adapter->flags & FLAG_APME_IN_WUC) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5179
		/* APME bit in EEPROM is mapped to WUC.APME */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5180
		eeprom_data = er32(WUC);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5181
		eeprom_apme_mask = E1000_WUC_APME;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5182
		if (eeprom_data & E1000_WUC_PHY_WAKE)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5183
			adapter->flags2 |= FLAG2_HAS_PHY_WAKEUP;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5184
	} else if (adapter->flags & FLAG_APME_IN_CTRL3) {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5185
		if (adapter->flags & FLAG_APME_CHECK_PORT_B &&
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5186
		    (adapter->hw.bus.func == 1))
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5187
			e1000_read_nvm(&adapter->hw,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5188
				NVM_INIT_CONTROL3_PORT_B, 1, &eeprom_data);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5189
		else
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5190
			e1000_read_nvm(&adapter->hw,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5191
				NVM_INIT_CONTROL3_PORT_A, 1, &eeprom_data);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5192
	}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5193
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5194
	/* fetch WoL from EEPROM */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5195
	if (eeprom_data & eeprom_apme_mask)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5196
		adapter->eeprom_wol |= E1000_WUFC_MAG;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5197
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5198
	/*
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5199
	 * now that we have the eeprom settings, apply the special cases
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5200
	 * where the eeprom may be wrong or the board simply won't support
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5201
	 * wake on lan on a particular port
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5202
	 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5203
	if (!(adapter->flags & FLAG_HAS_WOL))
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5204
		adapter->eeprom_wol = 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5205
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5206
	/* initialize the wol settings based on the eeprom settings */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5207
	adapter->wol = adapter->eeprom_wol;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5208
	device_set_wakeup_enable(&adapter->pdev->dev, adapter->wol);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5209
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5210
	/* save off EEPROM version number */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5211
	e1000_read_nvm(&adapter->hw, 5, 1, &adapter->eeprom_vers);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5212
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5213
	/* reset the hardware with the new settings */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5214
	e1000e_reset(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5215
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5216
	/*
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5217
	 * If the controller has AMT, do not set DRV_LOAD until the interface
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5218
	 * is up.  For all other cases, let the f/w know that the h/w is now
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5219
	 * under the control of the driver.
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5220
	 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5221
	if (!(adapter->flags & FLAG_HAS_AMT))
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5222
		e1000_get_hw_control(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5223
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5224
	strcpy(netdev->name, "eth%d");
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5225
	err = register_netdev(netdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5226
	if (err)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5227
		goto err_register;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5228
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5229
	/* carrier off reporting is important to ethtool even BEFORE open */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5230
	netif_carrier_off(netdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5231
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5232
	e1000_print_device_info(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5233
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5234
	return 0;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5235
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5236
err_register:
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5237
	if (!(adapter->flags & FLAG_HAS_AMT))
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5238
		e1000_release_hw_control(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5239
err_eeprom:
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5240
	if (!e1000_check_reset_block(&adapter->hw))
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5241
		e1000_phy_hw_reset(&adapter->hw);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5242
err_hw_init:
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5243
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5244
	kfree(adapter->tx_ring);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5245
	kfree(adapter->rx_ring);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5246
err_sw_init:
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5247
	if (adapter->hw.flash_address)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5248
		iounmap(adapter->hw.flash_address);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5249
	e1000e_reset_interrupt_capability(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5250
err_flashmap:
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5251
	iounmap(adapter->hw.hw_addr);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5252
err_ioremap:
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5253
	free_netdev(netdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5254
err_alloc_etherdev:
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5255
	pci_release_selected_regions(pdev,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5256
	                             pci_select_bars(pdev, IORESOURCE_MEM));
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5257
err_pci_reg:
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5258
err_dma:
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5259
	pci_disable_device(pdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5260
	return err;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5261
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5262
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5263
/**
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5264
 * e1000_remove - Device Removal Routine
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5265
 * @pdev: PCI device information struct
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5266
 *
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5267
 * e1000_remove is called by the PCI subsystem to alert the driver
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5268
 * that it should release a PCI device.  The could be caused by a
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5269
 * Hot-Plug event, or because the driver is going to be removed from
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5270
 * memory.
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5271
 **/
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5272
static void __devexit e1000_remove(struct pci_dev *pdev)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5273
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5274
	struct net_device *netdev = pci_get_drvdata(pdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5275
	struct e1000_adapter *adapter = netdev_priv(netdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5276
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5277
	/*
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5278
	 * flush_scheduled work may reschedule our watchdog task, so
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5279
	 * explicitly disable watchdog tasks from being rescheduled
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5280
	 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5281
	set_bit(__E1000_DOWN, &adapter->state);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5282
	del_timer_sync(&adapter->watchdog_timer);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5283
	del_timer_sync(&adapter->phy_info_timer);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5284
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5285
	flush_scheduled_work();
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5286
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5287
	/*
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5288
	 * Release control of h/w to f/w.  If f/w is AMT enabled, this
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5289
	 * would have already happened in close and is redundant.
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5290
	 */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5291
	e1000_release_hw_control(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5292
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5293
	unregister_netdev(netdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5294
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5295
	if (!e1000_check_reset_block(&adapter->hw))
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5296
		e1000_phy_hw_reset(&adapter->hw);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5297
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5298
	e1000e_reset_interrupt_capability(adapter);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5299
	kfree(adapter->tx_ring);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5300
	kfree(adapter->rx_ring);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5301
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5302
	iounmap(adapter->hw.hw_addr);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5303
	if (adapter->hw.flash_address)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5304
		iounmap(adapter->hw.flash_address);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5305
	pci_release_selected_regions(pdev,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5306
	                             pci_select_bars(pdev, IORESOURCE_MEM));
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5307
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5308
	free_netdev(netdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5309
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5310
	/* AER disable */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5311
	pci_disable_pcie_error_reporting(pdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5312
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5313
	pci_disable_device(pdev);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5314
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5315
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5316
/* PCI Error Recovery (ERS) */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5317
static struct pci_error_handlers e1000_err_handler = {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5318
	.error_detected = e1000_io_error_detected,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5319
	.slot_reset = e1000_io_slot_reset,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5320
	.resume = e1000_io_resume,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5321
};
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5322
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5323
static struct pci_device_id e1000_pci_tbl[] = {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5324
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82571EB_COPPER), board_82571 },
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5325
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82571EB_FIBER), board_82571 },
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5326
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82571EB_QUAD_COPPER), board_82571 },
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5327
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82571EB_QUAD_COPPER_LP), board_82571 },
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5328
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82571EB_QUAD_FIBER), board_82571 },
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5329
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82571EB_SERDES), board_82571 },
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5330
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82571EB_SERDES_DUAL), board_82571 },
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5331
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82571EB_SERDES_QUAD), board_82571 },
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5332
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82571PT_QUAD_COPPER), board_82571 },
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5333
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5334
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82572EI), board_82572 },
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5335
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82572EI_COPPER), board_82572 },
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5336
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82572EI_FIBER), board_82572 },
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5337
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82572EI_SERDES), board_82572 },
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5338
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5339
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82573E), board_82573 },
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5340
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82573E_IAMT), board_82573 },
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5341
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82573L), board_82573 },
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5342
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5343
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82574L), board_82574 },
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5344
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82574LA), board_82574 },
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5345
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82583V), board_82583 },
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5346
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5347
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_80003ES2LAN_COPPER_DPT),
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5348
	  board_80003es2lan },
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5349
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_80003ES2LAN_COPPER_SPT),
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5350
	  board_80003es2lan },
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5351
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_80003ES2LAN_SERDES_DPT),
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5352
	  board_80003es2lan },
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5353
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_80003ES2LAN_SERDES_SPT),
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5354
	  board_80003es2lan },
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5355
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5356
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH8_IFE), board_ich8lan },
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5357
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH8_IFE_G), board_ich8lan },
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5358
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH8_IFE_GT), board_ich8lan },
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5359
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH8_IGP_AMT), board_ich8lan },
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5360
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH8_IGP_C), board_ich8lan },
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5361
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH8_IGP_M), board_ich8lan },
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5362
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH8_IGP_M_AMT), board_ich8lan },
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5363
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH8_82567V_3), board_ich8lan },
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5364
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5365
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH9_IFE), board_ich9lan },
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5366
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH9_IFE_G), board_ich9lan },
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5367
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH9_IFE_GT), board_ich9lan },
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5368
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH9_IGP_AMT), board_ich9lan },
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5369
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH9_IGP_C), board_ich9lan },
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5370
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH9_BM), board_ich9lan },
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5371
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH9_IGP_M), board_ich9lan },
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5372
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH9_IGP_M_AMT), board_ich9lan },
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5373
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH9_IGP_M_V), board_ich9lan },
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5374
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5375
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH10_R_BM_LM), board_ich9lan },
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5376
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH10_R_BM_LF), board_ich9lan },
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5377
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH10_R_BM_V), board_ich9lan },
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5378
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5379
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH10_D_BM_LM), board_ich10lan },
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5380
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH10_D_BM_LF), board_ich10lan },
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5381
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5382
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH_M_HV_LM), board_pchlan },
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5383
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH_M_HV_LC), board_pchlan },
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5384
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH_D_HV_DM), board_pchlan },
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5385
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH_D_HV_DC), board_pchlan },
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5386
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5387
	{ }	/* terminate list */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5388
};
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5389
MODULE_DEVICE_TABLE(pci, e1000_pci_tbl);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5390
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5391
/* PCI Device API Driver */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5392
static struct pci_driver e1000_driver = {
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5393
	.name     = e1000e_driver_name,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5394
	.id_table = e1000_pci_tbl,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5395
	.probe    = e1000_probe,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5396
	.remove   = __devexit_p(e1000_remove),
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5397
#ifdef CONFIG_PM
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5398
	/* Power Management Hooks */
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5399
	.suspend  = e1000_suspend,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5400
	.resume   = e1000_resume,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5401
#endif
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5402
	.shutdown = e1000_shutdown,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5403
	.err_handler = &e1000_err_handler
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5404
};
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5405
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5406
/**
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5407
 * e1000_init_module - Driver Registration Routine
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5408
 *
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5409
 * e1000_init_module is the first routine called when the driver is
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5410
 * loaded. All it does is register with the PCI subsystem.
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5411
 **/
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5412
static int __init e1000_init_module(void)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5413
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5414
	int ret;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5415
	printk(KERN_INFO "%s: Intel(R) PRO/1000 Network Driver - %s\n",
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5416
	       e1000e_driver_name, e1000e_driver_version);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5417
	printk(KERN_INFO "%s: Copyright (c) 1999-2008 Intel Corporation.\n",
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5418
	       e1000e_driver_name);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5419
	ret = pci_register_driver(&e1000_driver);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5420
	pm_qos_add_requirement(PM_QOS_CPU_DMA_LATENCY, e1000e_driver_name,
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5421
			       PM_QOS_DEFAULT_VALUE);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5422
				
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5423
	return ret;
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5424
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5425
module_init(e1000_init_module);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5426
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5427
/**
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5428
 * e1000_exit_module - Driver Exit Cleanup Routine
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5429
 *
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5430
 * e1000_exit_module is called just before the driver is removed
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5431
 * from memory.
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5432
 **/
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5433
static void __exit e1000_exit_module(void)
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5434
{
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5435
	pci_unregister_driver(&e1000_driver);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5436
	pm_qos_remove_requirement(PM_QOS_CPU_DMA_LATENCY, e1000e_driver_name);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5437
}
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5438
module_exit(e1000_exit_module);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5439
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5440
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5441
MODULE_AUTHOR("Intel Corporation, <linux.nics@intel.com>");
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5442
MODULE_DESCRIPTION("Intel(R) PRO/1000 Network Driver");
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5443
MODULE_LICENSE("GPL");
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5444
MODULE_VERSION(DRV_VERSION);
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5445
6787ee69205e Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5446
/* e1000_main.c */