devices/e1000e/netdev-2.6.32-orig.c
author Knud Baastrup <kba@deif.com>
Tue, 14 Apr 2015 10:12:55 -0400
changeset 2625 e25af8bd3957
parent 2131 2cefec773772
permissions -rw-r--r--
Eoe mac address now derived from unique mac.
The EoE MAC address is now derived from the NIC part of the first global
unique MAC address of the linked list of available network interfaces or
otherwise the MAC address used by the EtherCAT master. The EoE MAC address
will get the format 02:NIC:NIC:NIC:RP:RP where NIC comes from the unique MAC
address (if available) and RP is the ring position of the EoE slave.
2131
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     1
/*******************************************************************************
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     2
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     3
  Intel PRO/1000 Linux driver
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     4
  Copyright(c) 1999 - 2008 Intel Corporation.
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     5
2cefec773772 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
2cefec773772 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,
2cefec773772 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.
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     9
2cefec773772 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
2cefec773772 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
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    13
  more details.
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    14
2cefec773772 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
2cefec773772 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.,
2cefec773772 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.
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    18
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    20
  the file called "COPYING".
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    21
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    22
  Contact Information:
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    23
  Linux NICS <linux.nics@intel.com>
2cefec773772 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>
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    26
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    27
*******************************************************************************/
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    28
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    29
#include <linux/module.h>
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    30
#include <linux/types.h>
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    31
#include <linux/init.h>
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    32
#include <linux/pci.h>
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    33
#include <linux/vmalloc.h>
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    34
#include <linux/pagemap.h>
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    35
#include <linux/delay.h>
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    36
#include <linux/netdevice.h>
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    37
#include <linux/tcp.h>
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    38
#include <linux/ipv6.h>
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    39
#include <net/checksum.h>
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    40
#include <net/ip6_checksum.h>
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    41
#include <linux/mii.h>
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    42
#include <linux/ethtool.h>
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    43
#include <linux/if_vlan.h>
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    44
#include <linux/cpu.h>
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    45
#include <linux/smp.h>
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    46
#include <linux/pm_qos_params.h>
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    47
#include <linux/aer.h>
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    48
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    49
#include "e1000.h"
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    50
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    51
#define DRV_VERSION "1.0.2-k2"
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    52
char e1000e_driver_name[] = "e1000e";
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    53
const char e1000e_driver_version[] = DRV_VERSION;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    54
2cefec773772 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[] = {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    56
	[board_82571]		= &e1000_82571_info,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    57
	[board_82572]		= &e1000_82572_info,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    58
	[board_82573]		= &e1000_82573_info,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    59
	[board_82574]		= &e1000_82574_info,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    60
	[board_82583]		= &e1000_82583_info,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    61
	[board_80003es2lan]	= &e1000_es2_info,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    62
	[board_ich8lan]		= &e1000_ich8_info,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    63
	[board_ich9lan]		= &e1000_ich9_info,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    64
	[board_ich10lan]	= &e1000_ich10_info,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    65
	[board_pchlan]		= &e1000_pch_info,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    66
};
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    67
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    68
#ifdef DEBUG
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    69
/**
2cefec773772 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
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    72
 **/
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    74
{
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    75
	return hw->adapter->netdev->name;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    76
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    77
#endif
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    78
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    79
/**
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    81
 **/
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    83
{
2cefec773772 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)
2cefec773772 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;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    86
2cefec773772 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;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    88
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    89
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    90
/**
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    92
 * @adapter: board private structure
2cefec773772 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
2cefec773772 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)
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    96
 **/
2cefec773772 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,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    98
			      struct net_device *netdev,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    99
			      struct sk_buff *skb,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   100
			      u8 status, __le16 vlan)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   101
{
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   102
	skb->protocol = eth_type_trans(skb, netdev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   103
2cefec773772 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))
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   105
		vlan_gro_receive(&adapter->napi, adapter->vlgrp,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   106
				 le16_to_cpu(vlan), skb);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   107
	else
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   108
		napi_gro_receive(&adapter->napi, skb);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   109
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   110
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   111
/**
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   113
 * @adapter:     board private structure
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   115
 * @csum:	receive descriptor csum field
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   116
 * @sk_buff:     socket buffer with received data
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   117
 **/
2cefec773772 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,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   119
			      u32 csum, struct sk_buff *skb)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   120
{
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   121
	u16 status = (u16)status_err;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   122
	u8 errors = (u8)(status_err >> 24);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   123
	skb->ip_summed = CHECKSUM_NONE;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   124
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   125
	/* Ignore Checksum bit is set */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   126
	if (status & E1000_RXD_STAT_IXSM)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   127
		return;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   128
	/* TCP/UDP checksum error bit is set */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   129
	if (errors & E1000_RXD_ERR_TCPE) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   130
		/* let the stack verify checksum errors */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   131
		adapter->hw_csum_err++;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   132
		return;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   133
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   134
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   135
	/* TCP/UDP Checksum has not been calculated */
2cefec773772 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)))
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   137
		return;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   138
2cefec773772 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 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   140
	if (status & E1000_RXD_STAT_TCPCS) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   141
		/* TCP checksum is good */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   142
		skb->ip_summed = CHECKSUM_UNNECESSARY;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   143
	} else {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   144
		/*
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   145
		 * IP fragment with UDP payload
2cefec773772 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
2cefec773772 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.
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   148
		 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   149
		__sum16 sum = (__force __sum16)htons(csum);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   150
		skb->csum = csum_unfold(~sum);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   151
		skb->ip_summed = CHECKSUM_COMPLETE;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   152
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   153
	adapter->hw_csum_good++;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   154
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   155
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   156
/**
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   158
 * @adapter: address of board private structure
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   159
 **/
2cefec773772 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,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   161
				   int cleaned_count)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   162
{
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   163
	struct net_device *netdev = adapter->netdev;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   164
	struct pci_dev *pdev = adapter->pdev;
2cefec773772 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;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   166
	struct e1000_rx_desc *rx_desc;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   167
	struct e1000_buffer *buffer_info;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   168
	struct sk_buff *skb;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   169
	unsigned int i;
2cefec773772 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;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   171
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   172
	i = rx_ring->next_to_use;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   173
	buffer_info = &rx_ring->buffer_info[i];
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   174
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   175
	while (cleaned_count--) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   176
		skb = buffer_info->skb;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   177
		if (skb) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   178
			skb_trim(skb, 0);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   179
			goto map_skb;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   180
		}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   181
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   182
		skb = netdev_alloc_skb(netdev, bufsz);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   183
		if (!skb) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   184
			/* Better luck next round */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   185
			adapter->alloc_rx_buff_failed++;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   186
			break;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   187
		}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   188
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   189
		/*
2cefec773772 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
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   192
		 * the 14 byte MAC header is removed
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   193
		 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   194
		skb_reserve(skb, NET_IP_ALIGN);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   195
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   196
		buffer_info->skb = skb;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   197
map_skb:
2cefec773772 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,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   199
						  adapter->rx_buffer_len,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   200
						  PCI_DMA_FROMDEVICE);
2cefec773772 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)) {
2cefec773772 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");
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   203
			adapter->rx_dma_failed++;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   204
			break;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   205
		}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   206
2cefec773772 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);
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   209
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   210
		i++;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   211
		if (i == rx_ring->count)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   212
			i = 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   213
		buffer_info = &rx_ring->buffer_info[i];
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   214
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   215
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   216
	if (rx_ring->next_to_use != i) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   217
		rx_ring->next_to_use = i;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   218
		if (i-- == 0)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   219
			i = (rx_ring->count - 1);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   220
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   221
		/*
2cefec773772 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
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   224
		 * applicable for weak-ordered memory model archs,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   225
		 * such as IA-64).
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   226
		 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   227
		wmb();
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   229
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   230
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   231
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   232
/**
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   234
 * @adapter: address of board private structure
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   235
 **/
2cefec773772 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,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   237
				      int cleaned_count)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   238
{
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   239
	struct net_device *netdev = adapter->netdev;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   240
	struct pci_dev *pdev = adapter->pdev;
2cefec773772 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;
2cefec773772 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;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   243
	struct e1000_buffer *buffer_info;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   244
	struct e1000_ps_page *ps_page;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   245
	struct sk_buff *skb;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   246
	unsigned int i, j;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   247
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   248
	i = rx_ring->next_to_use;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   249
	buffer_info = &rx_ring->buffer_info[i];
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   250
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   251
	while (cleaned_count--) {
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   253
2cefec773772 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++) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   255
			ps_page = &buffer_info->ps_pages[j];
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   256
			if (j >= adapter->rx_ps_pages) {
2cefec773772 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 */
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   259
				continue;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   260
			}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   261
			if (!ps_page->page) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   262
				ps_page->page = alloc_page(GFP_ATOMIC);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   263
				if (!ps_page->page) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   264
					adapter->alloc_rx_buff_failed++;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   265
					goto no_buffers;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   266
				}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   267
				ps_page->dma = pci_map_page(pdev,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   268
						   ps_page->page,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   269
						   0, PAGE_SIZE,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   270
						   PCI_DMA_FROMDEVICE);
2cefec773772 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)) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   272
					dev_err(&adapter->pdev->dev,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   273
					  "RX DMA page map failed\n");
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   274
					adapter->rx_dma_failed++;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   275
					goto no_buffers;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   276
				}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   277
			}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   278
			/*
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   279
			 * Refresh the desc even if buffer_addrs
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   280
			 * didn't change because each write-back
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   281
			 * erases this info.
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   282
			 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   283
			rx_desc->read.buffer_addr[j+1] =
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   284
			     cpu_to_le64(ps_page->dma);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   285
		}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   286
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   287
		skb = netdev_alloc_skb(netdev,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   288
				       adapter->rx_ps_bsize0 + NET_IP_ALIGN);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   289
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   290
		if (!skb) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   291
			adapter->alloc_rx_buff_failed++;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   292
			break;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   293
		}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   294
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   295
		/*
2cefec773772 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
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   298
		 * the 14 byte MAC header is removed
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   299
		 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   300
		skb_reserve(skb, NET_IP_ALIGN);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   301
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   302
		buffer_info->skb = skb;
2cefec773772 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,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   304
						  adapter->rx_ps_bsize0,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   305
						  PCI_DMA_FROMDEVICE);
2cefec773772 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)) {
2cefec773772 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");
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   308
			adapter->rx_dma_failed++;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   309
			/* cleanup skb */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   310
			dev_kfree_skb_any(skb);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   311
			buffer_info->skb = NULL;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   312
			break;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   313
		}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   314
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   316
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   317
		i++;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   318
		if (i == rx_ring->count)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   319
			i = 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   320
		buffer_info = &rx_ring->buffer_info[i];
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   321
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   322
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   323
no_buffers:
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   324
	if (rx_ring->next_to_use != i) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   325
		rx_ring->next_to_use = i;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   326
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   327
		if (!(i--))
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   328
			i = (rx_ring->count - 1);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   329
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   330
		/*
2cefec773772 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
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   333
		 * applicable for weak-ordered memory model archs,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   334
		 * such as IA-64).
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   335
		 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   336
		wmb();
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   337
		/*
2cefec773772 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
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   340
		 * twice as much.
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   341
		 */
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   343
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   344
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   345
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   346
/**
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   348
 * @adapter: address of board private structure
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   350
 **/
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   351
2cefec773772 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,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   353
                                         int cleaned_count)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   354
{
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   355
	struct net_device *netdev = adapter->netdev;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   356
	struct pci_dev *pdev = adapter->pdev;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   357
	struct e1000_rx_desc *rx_desc;
2cefec773772 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;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   359
	struct e1000_buffer *buffer_info;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   360
	struct sk_buff *skb;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   361
	unsigned int i;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   362
	unsigned int bufsz = 256 -
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   363
	                     16 /* for skb_reserve */ -
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   364
	                     NET_IP_ALIGN;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   365
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   366
	i = rx_ring->next_to_use;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   367
	buffer_info = &rx_ring->buffer_info[i];
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   368
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   369
	while (cleaned_count--) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   370
		skb = buffer_info->skb;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   371
		if (skb) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   372
			skb_trim(skb, 0);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   373
			goto check_page;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   374
		}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   375
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   376
		skb = netdev_alloc_skb(netdev, bufsz);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   377
		if (unlikely(!skb)) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   378
			/* Better luck next round */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   379
			adapter->alloc_rx_buff_failed++;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   380
			break;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   381
		}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   382
2cefec773772 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
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   385
		 * the 14 byte MAC header is removed
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   386
		 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   387
		skb_reserve(skb, NET_IP_ALIGN);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   388
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   389
		buffer_info->skb = skb;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   390
check_page:
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   391
		/* allocate a new page if necessary */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   392
		if (!buffer_info->page) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   393
			buffer_info->page = alloc_page(GFP_ATOMIC);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   394
			if (unlikely(!buffer_info->page)) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   395
				adapter->alloc_rx_buff_failed++;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   396
				break;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   397
			}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   398
		}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   399
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   400
		if (!buffer_info->dma)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   401
			buffer_info->dma = pci_map_page(pdev,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   402
			                                buffer_info->page, 0,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   403
			                                PAGE_SIZE,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   404
			                                PCI_DMA_FROMDEVICE);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   405
2cefec773772 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);
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   408
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   409
		if (unlikely(++i == rx_ring->count))
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   410
			i = 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   411
		buffer_info = &rx_ring->buffer_info[i];
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   412
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   413
2cefec773772 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)) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   415
		rx_ring->next_to_use = i;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   416
		if (unlikely(i-- == 0))
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   417
			i = (rx_ring->count - 1);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   418
2cefec773772 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
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   421
		 * applicable for weak-ordered memory model archs,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   422
		 * such as IA-64). */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   423
		wmb();
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   425
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   426
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   427
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   428
/**
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   430
 * @adapter: board private structure
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   431
 *
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   433
 * is no guarantee that everything was cleaned
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   434
 **/
2cefec773772 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,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   436
			       int *work_done, int work_to_do)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   437
{
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   438
	struct net_device *netdev = adapter->netdev;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   439
	struct pci_dev *pdev = adapter->pdev;
2cefec773772 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;
2cefec773772 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;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   442
	struct e1000_buffer *buffer_info, *next_buffer;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   443
	u32 length;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   444
	unsigned int i;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   445
	int cleaned_count = 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   446
	bool cleaned = 0;
2cefec773772 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;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   448
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   449
	i = rx_ring->next_to_clean;
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   451
	buffer_info = &rx_ring->buffer_info[i];
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   452
2cefec773772 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) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   454
		struct sk_buff *skb;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   455
		u8 status;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   456
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   457
		if (*work_done >= work_to_do)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   458
			break;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   459
		(*work_done)++;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   460
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   461
		status = rx_desc->status;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   462
		skb = buffer_info->skb;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   463
		buffer_info->skb = NULL;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   464
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   465
		prefetch(skb->data - NET_IP_ALIGN);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   466
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   467
		i++;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   468
		if (i == rx_ring->count)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   469
			i = 0;
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   471
		prefetch(next_rxd);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   472
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   473
		next_buffer = &rx_ring->buffer_info[i];
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   474
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   475
		cleaned = 1;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   476
		cleaned_count++;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   477
		pci_unmap_single(pdev,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   478
				 buffer_info->dma,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   479
				 adapter->rx_buffer_len,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   480
				 PCI_DMA_FROMDEVICE);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   481
		buffer_info->dma = 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   482
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   483
		length = le16_to_cpu(rx_desc->length);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   484
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   485
		/*
2cefec773772 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
2cefec773772 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
2cefec773772 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
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   490
		 * definition only a frame fragment
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   491
		 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   492
		if (unlikely(!(status & E1000_RXD_STAT_EOP)))
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   493
			adapter->flags2 |= FLAG2_IS_DISCARDING;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   494
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   495
		if (adapter->flags2 & FLAG2_IS_DISCARDING) {
2cefec773772 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 */
2cefec773772 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",
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   498
			      netdev->name);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   499
			/* recycle */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   500
			buffer_info->skb = skb;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   501
			if (status & E1000_RXD_STAT_EOP)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   502
				adapter->flags2 &= ~FLAG2_IS_DISCARDING;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   503
			goto next_desc;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   504
		}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   505
2cefec773772 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) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   507
			/* recycle */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   508
			buffer_info->skb = skb;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   509
			goto next_desc;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   510
		}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   511
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   512
		/* adjust length to remove Ethernet CRC */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   513
		if (!(adapter->flags2 & FLAG2_CRC_STRIPPING))
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   514
			length -= 4;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   515
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   516
		total_rx_bytes += length;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   517
		total_rx_packets++;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   518
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   519
		/*
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   520
		 * code added for copybreak, this should improve
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   521
		 * performance for small packets with large amounts
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   522
		 * of reassembly being done in the stack
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   523
		 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   524
		if (length < copybreak) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   525
			struct sk_buff *new_skb =
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   527
			if (new_skb) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   528
				skb_reserve(new_skb, NET_IP_ALIGN);
2cefec773772 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,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   530
							       -NET_IP_ALIGN,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   531
							       (skb->data -
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   532
								NET_IP_ALIGN),
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   533
							       (length +
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   534
								NET_IP_ALIGN));
2cefec773772 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 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   536
				buffer_info->skb = skb;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   537
				skb = new_skb;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   538
			}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   539
			/* else just continue with the old one */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   540
		}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   541
		/* end copybreak code */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   542
		skb_put(skb, length);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   543
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   544
		/* Receive Checksum Offload */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   545
		e1000_rx_checksum(adapter,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   546
				  (u32)(status) |
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   547
				  ((u32)(rx_desc->errors) << 24),
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   548
				  le16_to_cpu(rx_desc->csum), skb);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   549
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   551
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   552
next_desc:
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   553
		rx_desc->status = 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   554
2cefec773772 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 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   556
		if (cleaned_count >= E1000_RX_BUFFER_WRITE) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   557
			adapter->alloc_rx_buf(adapter, cleaned_count);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   558
			cleaned_count = 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   559
		}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   560
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   561
		/* use prefetched values */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   562
		rx_desc = next_rxd;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   563
		buffer_info = next_buffer;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   564
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   565
	rx_ring->next_to_clean = i;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   566
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   567
	cleaned_count = e1000_desc_unused(rx_ring);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   568
	if (cleaned_count)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   569
		adapter->alloc_rx_buf(adapter, cleaned_count);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   570
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   571
	adapter->total_rx_bytes += total_rx_bytes;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   572
	adapter->total_rx_packets += total_rx_packets;
2cefec773772 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;
2cefec773772 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;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   575
	return cleaned;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   576
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   577
2cefec773772 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,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   579
			     struct e1000_buffer *buffer_info)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   580
{
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   581
	buffer_info->dma = 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   582
	if (buffer_info->skb) {
2cefec773772 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,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   584
		              DMA_TO_DEVICE);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   585
		dev_kfree_skb_any(buffer_info->skb);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   586
		buffer_info->skb = NULL;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   587
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   588
	buffer_info->time_stamp = 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   589
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   590
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   592
{
2cefec773772 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;
2cefec773772 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;
2cefec773772 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;
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   597
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   598
	/* detected Tx unit hang */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   599
	e_err("Detected Tx Unit Hang:\n"
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   600
	      "  TDH                  <%x>\n"
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   601
	      "  TDT                  <%x>\n"
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   602
	      "  next_to_use          <%x>\n"
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   603
	      "  next_to_clean        <%x>\n"
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   604
	      "buffer_info[next_to_clean]:\n"
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   605
	      "  time_stamp           <%lx>\n"
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   606
	      "  next_to_watch        <%x>\n"
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   607
	      "  jiffies              <%lx>\n"
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   608
	      "  next_to_watch.status <%x>\n",
2cefec773772 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),
2cefec773772 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),
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   611
	      tx_ring->next_to_use,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   612
	      tx_ring->next_to_clean,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   613
	      tx_ring->buffer_info[eop].time_stamp,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   614
	      eop,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   615
	      jiffies,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   616
	      eop_desc->upper.fields.status);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   617
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   618
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   619
/**
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   621
 * @adapter: board private structure
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   622
 *
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   624
 * is no guarantee that everything was cleaned
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   625
 **/
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   627
{
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   628
	struct net_device *netdev = adapter->netdev;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   629
	struct e1000_hw *hw = &adapter->hw;
2cefec773772 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;
2cefec773772 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;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   632
	struct e1000_buffer *buffer_info;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   633
	unsigned int i, eop;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   634
	unsigned int count = 0;
2cefec773772 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;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   636
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   637
	i = tx_ring->next_to_clean;
2cefec773772 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;
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   640
2cefec773772 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)) &&
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   642
	       (count < tx_ring->count)) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   643
		bool cleaned = false;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   644
		for (; !cleaned; count++) {
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   646
			buffer_info = &tx_ring->buffer_info[i];
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   647
			cleaned = (i == eop);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   648
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   649
			if (cleaned) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   650
				struct sk_buff *skb = buffer_info->skb;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   651
				unsigned int segs, bytecount;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   652
				segs = skb_shinfo(skb)->gso_segs ?: 1;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   653
				/* multiply data chunks by size of headers */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   654
				bytecount = ((segs - 1) * skb_headlen(skb)) +
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   655
					    skb->len;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   656
				total_tx_packets += segs;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   657
				total_tx_bytes += bytecount;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   658
			}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   659
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   660
			e1000_put_txbuf(adapter, buffer_info);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   661
			tx_desc->upper.data = 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   662
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   663
			i++;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   664
			if (i == tx_ring->count)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   665
				i = 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   666
		}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   667
2cefec773772 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;
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   670
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   671
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   672
	tx_ring->next_to_clean = i;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   673
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   674
#define TX_WAKE_THRESHOLD 32
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   675
	if (count && netif_carrier_ok(netdev) &&
2cefec773772 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) {
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   678
		 * sees the new next_to_clean.
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   679
		 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   680
		smp_mb();
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   681
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   682
		if (netif_queue_stopped(netdev) &&
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   683
		    !(test_bit(__E1000_DOWN, &adapter->state))) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   684
			netif_wake_queue(netdev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   685
			++adapter->restart_queue;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   686
		}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   687
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   688
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   689
	if (adapter->detect_tx_hung) {
2cefec773772 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
2cefec773772 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 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   692
		adapter->detect_tx_hung = 0;
2cefec773772 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 &&
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   695
			       + (adapter->tx_timeout_factor * HZ))
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   696
		    && !(er32(STATUS) & E1000_STATUS_TXOFF)) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   697
			e1000_print_tx_hang(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   698
			netif_stop_queue(netdev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   699
		}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   700
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   701
	adapter->total_tx_bytes += total_tx_bytes;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   702
	adapter->total_tx_packets += total_tx_packets;
2cefec773772 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;
2cefec773772 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;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   705
	return (count < tx_ring->count);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   706
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   707
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   708
/**
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   710
 * @adapter: board private structure
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   711
 *
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   713
 * is no guarantee that everything was cleaned
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   714
 **/
2cefec773772 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,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   716
				  int *work_done, int work_to_do)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   717
{
2cefec773772 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;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   719
	struct net_device *netdev = adapter->netdev;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   720
	struct pci_dev *pdev = adapter->pdev;
2cefec773772 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;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   722
	struct e1000_buffer *buffer_info, *next_buffer;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   723
	struct e1000_ps_page *ps_page;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   724
	struct sk_buff *skb;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   725
	unsigned int i, j;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   726
	u32 length, staterr;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   727
	int cleaned_count = 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   728
	bool cleaned = 0;
2cefec773772 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;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   730
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   731
	i = rx_ring->next_to_clean;
2cefec773772 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);
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   734
	buffer_info = &rx_ring->buffer_info[i];
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   735
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   736
	while (staterr & E1000_RXD_STAT_DD) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   737
		if (*work_done >= work_to_do)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   738
			break;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   739
		(*work_done)++;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   740
		skb = buffer_info->skb;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   741
2cefec773772 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 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   743
		prefetch(skb->data - NET_IP_ALIGN);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   744
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   745
		i++;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   746
		if (i == rx_ring->count)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   747
			i = 0;
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   749
		prefetch(next_rxd);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   750
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   751
		next_buffer = &rx_ring->buffer_info[i];
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   752
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   753
		cleaned = 1;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   754
		cleaned_count++;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   755
		pci_unmap_single(pdev, buffer_info->dma,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   756
				 adapter->rx_ps_bsize0,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   757
				 PCI_DMA_FROMDEVICE);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   758
		buffer_info->dma = 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   759
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   760
		/* see !EOP comment in other rx routine */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   761
		if (!(staterr & E1000_RXD_STAT_EOP))
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   762
			adapter->flags2 |= FLAG2_IS_DISCARDING;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   763
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   764
		if (adapter->flags2 & FLAG2_IS_DISCARDING) {
2cefec773772 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 "
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   766
			      "full packet\n", netdev->name);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   767
			dev_kfree_skb_irq(skb);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   768
			if (staterr & E1000_RXD_STAT_EOP)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   769
				adapter->flags2 &= ~FLAG2_IS_DISCARDING;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   770
			goto next_desc;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   771
		}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   772
2cefec773772 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) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   774
			dev_kfree_skb_irq(skb);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   775
			goto next_desc;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   776
		}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   777
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   779
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   780
		if (!length) {
2cefec773772 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 "
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   782
			      "descriptors\n", netdev->name);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   783
			dev_kfree_skb_irq(skb);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   784
			goto next_desc;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   785
		}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   786
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   787
		/* Good Receive */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   788
		skb_put(skb, length);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   789
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   790
		{
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   791
		/*
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   793
		 * more efficient than reusing j
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   794
		 */
2cefec773772 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]);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   796
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   797
		/*
2cefec773772 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
2cefec773772 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
2cefec773772 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_*
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   801
		 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   802
		if (l1 && (l1 <= copybreak) &&
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   803
		    ((length + l1) <= adapter->rx_ps_bsize0)) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   804
			u8 *vaddr;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   805
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   806
			ps_page = &buffer_info->ps_pages[0];
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   807
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   808
			/*
2cefec773772 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
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   811
			 * very long
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   812
			 */
2cefec773772 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,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   814
				PAGE_SIZE, PCI_DMA_FROMDEVICE);
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   816
			memcpy(skb_tail_pointer(skb), vaddr, l1);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   817
			kunmap_atomic(vaddr, KM_SKB_DATA_SOFTIRQ);
2cefec773772 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,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   819
				PAGE_SIZE, PCI_DMA_FROMDEVICE);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   820
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   821
			/* remove the CRC */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   822
			if (!(adapter->flags2 & FLAG2_CRC_STRIPPING))
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   823
				l1 -= 4;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   824
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   825
			skb_put(skb, l1);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   826
			goto copydone;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   827
		} /* if */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   828
		}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   829
2cefec773772 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++) {
2cefec773772 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]);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   832
			if (!length)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   833
				break;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   834
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   835
			ps_page = &buffer_info->ps_pages[j];
2cefec773772 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,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   837
				       PCI_DMA_FROMDEVICE);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   838
			ps_page->dma = 0;
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   840
			ps_page->page = NULL;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   841
			skb->len += length;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   842
			skb->data_len += length;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   843
			skb->truesize += length;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   844
		}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   845
2cefec773772 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
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   848
		 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   849
		if (!(adapter->flags2 & FLAG2_CRC_STRIPPING))
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   850
			pskb_trim(skb, skb->len - 4);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   851
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   852
copydone:
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   853
		total_rx_bytes += skb->len;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   854
		total_rx_packets++;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   855
2cefec773772 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(
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   858
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   859
		if (rx_desc->wb.upper.header_status &
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   860
			   cpu_to_le16(E1000_RXDPS_HDRSTAT_HDRSP))
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   861
			adapter->rx_hdr_split++;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   862
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   863
		e1000_receive_skb(adapter, netdev, skb,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   864
				  staterr, rx_desc->wb.middle.vlan);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   865
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   866
next_desc:
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   868
		buffer_info->skb = NULL;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   869
2cefec773772 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 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   871
		if (cleaned_count >= E1000_RX_BUFFER_WRITE) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   872
			adapter->alloc_rx_buf(adapter, cleaned_count);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   873
			cleaned_count = 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   874
		}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   875
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   876
		/* use prefetched values */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   877
		rx_desc = next_rxd;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   878
		buffer_info = next_buffer;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   879
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   881
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   882
	rx_ring->next_to_clean = i;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   883
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   884
	cleaned_count = e1000_desc_unused(rx_ring);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   885
	if (cleaned_count)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   886
		adapter->alloc_rx_buf(adapter, cleaned_count);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   887
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   888
	adapter->total_rx_bytes += total_rx_bytes;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   889
	adapter->total_rx_packets += total_rx_packets;
2cefec773772 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;
2cefec773772 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;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   892
	return cleaned;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   893
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   894
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   895
/**
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   896
 * e1000_consume_page - helper function
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   897
 **/
2cefec773772 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,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   899
                               u16 length)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   900
{
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   901
	bi->page = NULL;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   902
	skb->len += length;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   903
	skb->data_len += length;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   904
	skb->truesize += length;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   905
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   906
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   907
/**
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   909
 * @adapter: board private structure
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   910
 *
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   912
 * is no guarantee that everything was cleaned
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   913
 **/
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   914
2cefec773772 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,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   916
                                     int *work_done, int work_to_do)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   917
{
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   918
	struct net_device *netdev = adapter->netdev;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   919
	struct pci_dev *pdev = adapter->pdev;
2cefec773772 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;
2cefec773772 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;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   922
	struct e1000_buffer *buffer_info, *next_buffer;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   923
	u32 length;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   924
	unsigned int i;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   925
	int cleaned_count = 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   926
	bool cleaned = false;
2cefec773772 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;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   928
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   929
	i = rx_ring->next_to_clean;
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   931
	buffer_info = &rx_ring->buffer_info[i];
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   932
2cefec773772 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) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   934
		struct sk_buff *skb;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   935
		u8 status;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   936
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   937
		if (*work_done >= work_to_do)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   938
			break;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   939
		(*work_done)++;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   940
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   941
		status = rx_desc->status;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   942
		skb = buffer_info->skb;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   943
		buffer_info->skb = NULL;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   944
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   945
		++i;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   946
		if (i == rx_ring->count)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   947
			i = 0;
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   949
		prefetch(next_rxd);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   950
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   951
		next_buffer = &rx_ring->buffer_info[i];
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   952
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   953
		cleaned = true;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   954
		cleaned_count++;
2cefec773772 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,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   956
		               PCI_DMA_FROMDEVICE);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   957
		buffer_info->dma = 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   958
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   959
		length = le16_to_cpu(rx_desc->length);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   960
2cefec773772 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 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   962
		if (unlikely((status & E1000_RXD_STAT_EOP) &&
2cefec773772 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))) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   964
				/* recycle both page and skb */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   965
				buffer_info->skb = skb;
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   967
				 * too */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   968
				if (rx_ring->rx_skb_top)
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   970
				rx_ring->rx_skb_top = NULL;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   971
				goto next_desc;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   972
		}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   973
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   974
#define rxtop rx_ring->rx_skb_top
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   975
		if (!(status & E1000_RXD_STAT_EOP)) {
2cefec773772 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) */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   977
			if (!rxtop) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   978
				/* this is the beginning of a chain */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   979
				rxtop = skb;
2cefec773772 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,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   981
				                   0, length);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   982
			} else {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   983
				/* this is the middle of a chain */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   984
				skb_fill_page_desc(rxtop,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   985
				    skb_shinfo(rxtop)->nr_frags,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   986
				    buffer_info->page, 0, length);
2cefec773772 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 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   988
				buffer_info->skb = skb;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   989
			}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   990
			e1000_consume_page(buffer_info, rxtop, length);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   991
			goto next_desc;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   992
		} else {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   993
			if (rxtop) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   994
				/* end of the chain */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   995
				skb_fill_page_desc(rxtop,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   996
				    skb_shinfo(rxtop)->nr_frags,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   997
				    buffer_info->page, 0, length);
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   999
				 * page */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1000
				buffer_info->skb = skb;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1001
				skb = rxtop;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1002
				rxtop = NULL;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1003
				e1000_consume_page(buffer_info, skb, length);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1004
			} else {
2cefec773772 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
2cefec773772 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 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1007
				if (length <= copybreak &&
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1008
				    skb_tailroom(skb) >= length) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1009
					u8 *vaddr;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1010
					vaddr = kmap_atomic(buffer_info->page,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1011
					                   KM_SKB_DATA_SOFTIRQ);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1012
					memcpy(skb_tail_pointer(skb), vaddr,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1013
					       length);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1014
					kunmap_atomic(vaddr,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1015
					              KM_SKB_DATA_SOFTIRQ);
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1017
					 * buffer_info->page */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1018
					skb_put(skb, length);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1019
				} else {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1020
					skb_fill_page_desc(skb, 0,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1021
					                   buffer_info->page, 0,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1022
				                           length);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1023
					e1000_consume_page(buffer_info, skb,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1024
					                   length);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1025
				}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1026
			}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1027
		}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1028
2cefec773772 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? */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1030
		e1000_rx_checksum(adapter,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1031
		                  (u32)(status) |
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1032
		                  ((u32)(rx_desc->errors) << 24),
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1033
		                  le16_to_cpu(rx_desc->csum), skb);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1034
2cefec773772 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 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1036
		total_rx_bytes += skb->len;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1037
		total_rx_packets++;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1038
2cefec773772 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 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1040
		if (!pskb_may_pull(skb, ETH_HLEN)) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1041
			e_err("pskb_may_pull failed.\n");
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1042
			dev_kfree_skb(skb);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1043
			goto next_desc;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1044
		}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1045
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1046
		e1000_receive_skb(adapter, netdev, skb, status,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1047
		                  rx_desc->special);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1048
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1049
next_desc:
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1050
		rx_desc->status = 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1051
2cefec773772 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 */
2cefec773772 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)) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1054
			adapter->alloc_rx_buf(adapter, cleaned_count);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1055
			cleaned_count = 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1056
		}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1057
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1058
		/* use prefetched values */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1059
		rx_desc = next_rxd;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1060
		buffer_info = next_buffer;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1061
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1062
	rx_ring->next_to_clean = i;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1063
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1064
	cleaned_count = e1000_desc_unused(rx_ring);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1065
	if (cleaned_count)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1066
		adapter->alloc_rx_buf(adapter, cleaned_count);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1067
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1068
	adapter->total_rx_bytes += total_rx_bytes;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1069
	adapter->total_rx_packets += total_rx_packets;
2cefec773772 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;
2cefec773772 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;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1072
	return cleaned;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1073
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1074
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1075
/**
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1077
 * @adapter: board private structure
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1078
 **/
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1080
{
2cefec773772 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;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1082
	struct e1000_buffer *buffer_info;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1083
	struct e1000_ps_page *ps_page;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1084
	struct pci_dev *pdev = adapter->pdev;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1085
	unsigned int i, j;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1086
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1087
	/* Free all the Rx ring sk_buffs */
2cefec773772 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++) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1089
		buffer_info = &rx_ring->buffer_info[i];
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1090
		if (buffer_info->dma) {
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1092
				pci_unmap_single(pdev, buffer_info->dma,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1093
						 adapter->rx_buffer_len,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1094
						 PCI_DMA_FROMDEVICE);
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1096
				pci_unmap_page(pdev, buffer_info->dma,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1097
				               PAGE_SIZE,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1098
				               PCI_DMA_FROMDEVICE);
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1100
				pci_unmap_single(pdev, buffer_info->dma,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1101
						 adapter->rx_ps_bsize0,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1102
						 PCI_DMA_FROMDEVICE);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1103
			buffer_info->dma = 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1104
		}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1105
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1106
		if (buffer_info->page) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1107
			put_page(buffer_info->page);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1108
			buffer_info->page = NULL;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1109
		}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1110
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1111
		if (buffer_info->skb) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1112
			dev_kfree_skb(buffer_info->skb);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1113
			buffer_info->skb = NULL;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1114
		}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1115
2cefec773772 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++) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1117
			ps_page = &buffer_info->ps_pages[j];
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1118
			if (!ps_page->page)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1119
				break;
2cefec773772 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,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1121
				       PCI_DMA_FROMDEVICE);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1122
			ps_page->dma = 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1123
			put_page(ps_page->page);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1124
			ps_page->page = NULL;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1125
		}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1126
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1127
2cefec773772 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 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1129
	if (rx_ring->rx_skb_top) {
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1131
		rx_ring->rx_skb_top = NULL;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1132
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1133
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1134
	/* Zero out the descriptor ring */
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1136
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1137
	rx_ring->next_to_clean = 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1138
	rx_ring->next_to_use = 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1139
	adapter->flags2 &= ~FLAG2_IS_DISCARDING;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1140
2cefec773772 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);
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1143
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1144
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1146
{
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1147
	struct e1000_adapter *adapter = container_of(work,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1148
					struct e1000_adapter, downshift_task);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1149
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1150
	e1000e_gig_downshift_workaround_ich8lan(&adapter->hw);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1151
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1152
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1153
/**
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1154
 * e1000_intr_msi - Interrupt Handler
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1155
 * @irq: interrupt number
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1157
 **/
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1159
{
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1160
	struct net_device *netdev = data;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1161
	struct e1000_adapter *adapter = netdev_priv(netdev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1162
	struct e1000_hw *hw = &adapter->hw;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1163
	u32 icr = er32(ICR);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1164
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1165
	/*
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1166
	 * read ICR disables interrupts using IAM
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1167
	 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1168
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1169
	if (icr & E1000_ICR_LSC) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1170
		hw->mac.get_link_status = 1;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1171
		/*
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1173
		 * disconnect (LSC) before accessing any PHY registers
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1174
		 */
2cefec773772 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) &&
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1176
		    (!(er32(STATUS) & E1000_STATUS_LU)))
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1177
			schedule_work(&adapter->downshift_task);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1178
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1179
		/*
2cefec773772 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
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1182
		 * adapter in watchdog
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1183
		 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1184
		if (netif_carrier_ok(netdev) &&
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1185
		    adapter->flags & FLAG_RX_NEEDS_RESTART) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1186
			/* disable receives */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1187
			u32 rctl = er32(RCTL);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1188
			ew32(RCTL, rctl & ~E1000_RCTL_EN);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1189
			adapter->flags |= FLAG_RX_RESTART_NOW;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1190
		}
2cefec773772 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 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1192
		if (!test_bit(__E1000_DOWN, &adapter->state))
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1193
			mod_timer(&adapter->watchdog_timer, jiffies + 1);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1194
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1195
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1196
	if (napi_schedule_prep(&adapter->napi)) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1197
		adapter->total_tx_bytes = 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1198
		adapter->total_tx_packets = 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1199
		adapter->total_rx_bytes = 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1200
		adapter->total_rx_packets = 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1201
		__napi_schedule(&adapter->napi);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1202
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1203
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1204
	return IRQ_HANDLED;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1205
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1206
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1207
/**
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1208
 * e1000_intr - Interrupt Handler
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1209
 * @irq: interrupt number
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1211
 **/
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1213
{
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1214
	struct net_device *netdev = data;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1215
	struct e1000_adapter *adapter = netdev_priv(netdev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1216
	struct e1000_hw *hw = &adapter->hw;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1217
	u32 rctl, icr = er32(ICR);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1218
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1219
	if (!icr)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1220
		return IRQ_NONE;  /* Not our interrupt */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1221
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1222
	/*
2cefec773772 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
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1225
	 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1226
	if (!(icr & E1000_ICR_INT_ASSERTED))
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1227
		return IRQ_NONE;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1228
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1229
	/*
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1230
	 * Interrupt Auto-Mask...upon reading ICR,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1231
	 * interrupts are masked.  No need for the
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1232
	 * IMC write
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1233
	 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1234
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1235
	if (icr & E1000_ICR_LSC) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1236
		hw->mac.get_link_status = 1;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1237
		/*
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1239
		 * disconnect (LSC) before accessing any PHY registers
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1240
		 */
2cefec773772 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) &&
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1242
		    (!(er32(STATUS) & E1000_STATUS_LU)))
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1243
			schedule_work(&adapter->downshift_task);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1244
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1245
		/*
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1246
		 * 80003ES2LAN workaround--
2cefec773772 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;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1248
		 * disable receives here in the ISR and
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1249
		 * reset adapter in watchdog
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1250
		 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1251
		if (netif_carrier_ok(netdev) &&
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1252
		    (adapter->flags & FLAG_RX_NEEDS_RESTART)) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1253
			/* disable receives */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1254
			rctl = er32(RCTL);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1255
			ew32(RCTL, rctl & ~E1000_RCTL_EN);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1256
			adapter->flags |= FLAG_RX_RESTART_NOW;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1257
		}
2cefec773772 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 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1259
		if (!test_bit(__E1000_DOWN, &adapter->state))
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1260
			mod_timer(&adapter->watchdog_timer, jiffies + 1);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1261
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1262
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1263
	if (napi_schedule_prep(&adapter->napi)) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1264
		adapter->total_tx_bytes = 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1265
		adapter->total_tx_packets = 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1266
		adapter->total_rx_bytes = 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1267
		adapter->total_rx_packets = 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1268
		__napi_schedule(&adapter->napi);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1269
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1270
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1271
	return IRQ_HANDLED;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1272
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1273
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1275
{
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1276
	struct net_device *netdev = data;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1277
	struct e1000_adapter *adapter = netdev_priv(netdev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1278
	struct e1000_hw *hw = &adapter->hw;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1279
	u32 icr = er32(ICR);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1280
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1281
	if (!(icr & E1000_ICR_INT_ASSERTED)) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1282
		if (!test_bit(__E1000_DOWN, &adapter->state))
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1283
			ew32(IMS, E1000_IMS_OTHER);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1284
		return IRQ_NONE;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1285
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1286
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1287
	if (icr & adapter->eiac_mask)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1288
		ew32(ICS, (icr & adapter->eiac_mask));
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1289
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1290
	if (icr & E1000_ICR_OTHER) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1291
		if (!(icr & E1000_ICR_LSC))
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1292
			goto no_link_interrupt;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1293
		hw->mac.get_link_status = 1;
2cefec773772 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 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1295
		if (!test_bit(__E1000_DOWN, &adapter->state))
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1296
			mod_timer(&adapter->watchdog_timer, jiffies + 1);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1297
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1298
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1299
no_link_interrupt:
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1300
	if (!test_bit(__E1000_DOWN, &adapter->state))
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1302
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1303
	return IRQ_HANDLED;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1304
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1305
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1306
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1308
{
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1309
	struct net_device *netdev = data;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1310
	struct e1000_adapter *adapter = netdev_priv(netdev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1311
	struct e1000_hw *hw = &adapter->hw;
2cefec773772 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;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1313
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1314
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1315
	adapter->total_tx_bytes = 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1316
	adapter->total_tx_packets = 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1317
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1318
	if (!e1000_clean_tx_irq(adapter))
2cefec773772 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 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1320
		ew32(ICS, tx_ring->ims_val);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1321
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1322
	return IRQ_HANDLED;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1323
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1324
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1326
{
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1327
	struct net_device *netdev = data;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1328
	struct e1000_adapter *adapter = netdev_priv(netdev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1329
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1331
	 * previous interrupt.
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1332
	 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1333
	if (adapter->rx_ring->set_itr) {
2cefec773772 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),
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1336
		adapter->rx_ring->set_itr = 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1337
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1338
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1339
	if (napi_schedule_prep(&adapter->napi)) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1340
		adapter->total_rx_bytes = 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1341
		adapter->total_rx_packets = 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1342
		__napi_schedule(&adapter->napi);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1343
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1344
	return IRQ_HANDLED;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1345
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1346
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1347
/**
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1348
 * e1000_configure_msix - Configure MSI-X hardware
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1349
 *
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1351
 * generate MSI-X interrupts.
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1352
 **/
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1354
{
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1355
	struct e1000_hw *hw = &adapter->hw;
2cefec773772 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;
2cefec773772 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;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1358
	int vector = 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1359
	u32 ctrl_ext, ivar = 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1360
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1361
	adapter->eiac_mask = 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1362
2cefec773772 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 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1364
	if (hw->mac.type == e1000_82574) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1365
		u32 rfctl = er32(RFCTL);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1366
		rfctl |= E1000_RFCTL_ACK_DIS;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1367
		ew32(RFCTL, rfctl);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1368
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1369
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1370
#define E1000_IVAR_INT_ALLOC_VALID	0x8
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1371
	/* Configure Rx vector */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1372
	rx_ring->ims_val = E1000_IMS_RXQ0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1373
	adapter->eiac_mask |= rx_ring->ims_val;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1374
	if (rx_ring->itr_val)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1375
		writel(1000000000 / (rx_ring->itr_val * 256),
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1376
		       hw->hw_addr + rx_ring->itr_register);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1377
	else
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1379
	ivar = E1000_IVAR_INT_ALLOC_VALID | vector;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1380
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1381
	/* Configure Tx vector */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1382
	tx_ring->ims_val = E1000_IMS_TXQ0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1383
	vector++;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1384
	if (tx_ring->itr_val)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1385
		writel(1000000000 / (tx_ring->itr_val * 256),
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1386
		       hw->hw_addr + tx_ring->itr_register);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1387
	else
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1389
	adapter->eiac_mask |= tx_ring->ims_val;
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1391
2cefec773772 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 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1393
	vector++;
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1395
	if (rx_ring->itr_val)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1396
		writel(1000000000 / (rx_ring->itr_val * 256),
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1397
		       hw->hw_addr + E1000_EITR_82574(vector));
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1398
	else
2cefec773772 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));
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1400
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1401
	/* Cause Tx interrupts on every write back */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1402
	ivar |= (1 << 31);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1403
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1404
	ew32(IVAR, ivar);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1405
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1406
	/* enable MSI-X PBA support */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1407
	ctrl_ext = er32(CTRL_EXT);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1408
	ctrl_ext |= E1000_CTRL_EXT_PBA_CLR;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1409
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1410
	/* Auto-Mask Other interrupts upon ICR read */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1411
#define E1000_EIAC_MASK_82574   0x01F00000
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1413
	ctrl_ext |= E1000_CTRL_EXT_EIAME;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1414
	ew32(CTRL_EXT, ctrl_ext);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1415
	e1e_flush();
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1416
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1417
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1419
{
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1420
	if (adapter->msix_entries) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1421
		pci_disable_msix(adapter->pdev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1422
		kfree(adapter->msix_entries);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1423
		adapter->msix_entries = NULL;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1424
	} else if (adapter->flags & FLAG_MSI_ENABLED) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1425
		pci_disable_msi(adapter->pdev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1426
		adapter->flags &= ~FLAG_MSI_ENABLED;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1427
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1428
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1429
	return;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1430
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1431
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1432
/**
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1434
 *
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1436
 * capabilities of the hardware and kernel.
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1437
 **/
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1439
{
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1440
	int err;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1441
	int numvecs, i;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1442
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1443
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1444
	switch (adapter->int_mode) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1445
	case E1000E_INT_MODE_MSIX:
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1446
		if (adapter->flags & FLAG_HAS_MSIX) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1447
			numvecs = 3; /* RxQ0, TxQ0 and other */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1448
			adapter->msix_entries = kcalloc(numvecs,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1449
						      sizeof(struct msix_entry),
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1450
						      GFP_KERNEL);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1451
			if (adapter->msix_entries) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1452
				for (i = 0; i < numvecs; i++)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1453
					adapter->msix_entries[i].entry = i;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1454
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1455
				err = pci_enable_msix(adapter->pdev,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1456
						      adapter->msix_entries,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1457
						      numvecs);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1458
				if (err == 0)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1459
					return;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1460
			}
2cefec773772 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 */
2cefec773772 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.  "
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1463
			      "Falling back to MSI interrupts.\n");
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1464
			e1000e_reset_interrupt_capability(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1465
		}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1466
		adapter->int_mode = E1000E_INT_MODE_MSI;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1467
		/* Fall through */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1468
	case E1000E_INT_MODE_MSI:
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1469
		if (!pci_enable_msi(adapter->pdev)) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1470
			adapter->flags |= FLAG_MSI_ENABLED;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1471
		} else {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1472
			adapter->int_mode = E1000E_INT_MODE_LEGACY;
2cefec773772 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 "
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1474
			      "back to legacy interrupts.\n");
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1475
		}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1476
		/* Fall through */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1477
	case E1000E_INT_MODE_LEGACY:
2cefec773772 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 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1479
		break;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1480
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1481
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1482
	return;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1483
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1484
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1485
/**
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1486
 * e1000_request_msix - Initialize MSI-X interrupts
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1487
 *
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1489
 * kernel.
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1490
 **/
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1492
{
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1493
	struct net_device *netdev = adapter->netdev;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1494
	int err = 0, vector = 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1495
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1496
	if (strlen(netdev->name) < (IFNAMSIZ - 5))
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1498
	else
2cefec773772 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);
2cefec773772 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,
2cefec773772 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,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1502
			  netdev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1503
	if (err)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1504
		goto out;
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1506
	adapter->rx_ring->itr_val = adapter->itr;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1507
	vector++;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1508
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1509
	if (strlen(netdev->name) < (IFNAMSIZ - 5))
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1511
	else
2cefec773772 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);
2cefec773772 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,
2cefec773772 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,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1515
			  netdev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1516
	if (err)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1517
		goto out;
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1519
	adapter->tx_ring->itr_val = adapter->itr;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1520
	vector++;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1521
2cefec773772 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,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1523
			  &e1000_msix_other, 0, netdev->name, netdev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1524
	if (err)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1525
		goto out;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1526
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1527
	e1000_configure_msix(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1528
	return 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1529
out:
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1530
	return err;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1531
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1532
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1533
/**
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1534
 * e1000_request_irq - initialize interrupts
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1535
 *
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1537
 * capabilities of the hardware and kernel.
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1538
 **/
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1540
{
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1541
	struct net_device *netdev = adapter->netdev;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1542
	int err;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1543
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1544
	if (adapter->msix_entries) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1545
		err = e1000_request_msix(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1546
		if (!err)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1547
			return err;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1548
		/* fall back to MSI */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1549
		e1000e_reset_interrupt_capability(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1550
		adapter->int_mode = E1000E_INT_MODE_MSI;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1551
		e1000e_set_interrupt_capability(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1552
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1553
	if (adapter->flags & FLAG_MSI_ENABLED) {
2cefec773772 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,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1555
				  netdev->name, netdev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1556
		if (!err)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1557
			return err;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1558
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1559
		/* fall back to legacy interrupt */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1560
		e1000e_reset_interrupt_capability(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1561
		adapter->int_mode = E1000E_INT_MODE_LEGACY;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1562
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1563
2cefec773772 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,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1565
			  netdev->name, netdev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1566
	if (err)
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1568
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1569
	return err;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1570
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1571
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1573
{
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1574
	struct net_device *netdev = adapter->netdev;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1575
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1576
	if (adapter->msix_entries) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1577
		int vector = 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1578
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1580
		vector++;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1581
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1583
		vector++;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1584
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1585
		/* Other Causes interrupt vector */
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1587
		return;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1588
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1589
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1590
	free_irq(adapter->pdev->irq, netdev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1591
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1592
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1593
/**
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1595
 **/
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1597
{
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1598
	struct e1000_hw *hw = &adapter->hw;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1599
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1600
	ew32(IMC, ~0);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1601
	if (adapter->msix_entries)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1602
		ew32(EIAC_82574, 0);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1603
	e1e_flush();
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1604
	synchronize_irq(adapter->pdev->irq);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1605
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1606
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1607
/**
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1609
 **/
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1611
{
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1612
	struct e1000_hw *hw = &adapter->hw;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1613
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1614
	if (adapter->msix_entries) {
2cefec773772 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);
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1617
	} else {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1618
		ew32(IMS, IMS_ENABLE_MASK);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1619
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1620
	e1e_flush();
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1621
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1622
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1623
/**
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1625
 * @adapter: address of board private structure
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1626
 *
2cefec773772 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.
2cefec773772 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
2cefec773772 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)
2cefec773772 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.
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1631
 **/
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1633
{
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1634
	struct e1000_hw *hw = &adapter->hw;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1635
	u32 ctrl_ext;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1636
	u32 swsm;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1637
2cefec773772 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 */
2cefec773772 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) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1640
		swsm = er32(SWSM);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1641
		ew32(SWSM, swsm | E1000_SWSM_DRV_LOAD);
2cefec773772 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) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1643
		ctrl_ext = er32(CTRL_EXT);
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1645
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1646
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1647
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1648
/**
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1650
 * @adapter: address of board private structure
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1651
 *
2cefec773772 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.
2cefec773772 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
2cefec773772 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
2cefec773772 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.
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1656
 *
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1657
 **/
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1659
{
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1660
	struct e1000_hw *hw = &adapter->hw;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1661
	u32 ctrl_ext;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1662
	u32 swsm;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1663
2cefec773772 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 */
2cefec773772 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) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1666
		swsm = er32(SWSM);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1667
		ew32(SWSM, swsm & ~E1000_SWSM_DRV_LOAD);
2cefec773772 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) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1669
		ctrl_ext = er32(CTRL_EXT);
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1671
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1672
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1673
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1674
/**
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1676
 **/
2cefec773772 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,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1678
				struct e1000_ring *ring)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1679
{
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1680
	struct pci_dev *pdev = adapter->pdev;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1681
2cefec773772 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,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1683
					GFP_KERNEL);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1684
	if (!ring->desc)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1685
		return -ENOMEM;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1686
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1687
	return 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1688
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1689
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1690
/**
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1692
 * @adapter: board private structure
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1693
 *
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1694
 * Return 0 on success, negative on failure
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1695
 **/
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1697
{
2cefec773772 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;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1699
	int err = -ENOMEM, size;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1700
2cefec773772 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;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1702
	tx_ring->buffer_info = vmalloc(size);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1703
	if (!tx_ring->buffer_info)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1704
		goto err;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1705
	memset(tx_ring->buffer_info, 0, size);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1706
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1707
	/* round up to nearest 4K */
2cefec773772 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);
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1710
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1712
	if (err)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1713
		goto err;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1714
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1715
	tx_ring->next_to_use = 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1716
	tx_ring->next_to_clean = 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1717
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1718
	return 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1719
err:
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1720
	vfree(tx_ring->buffer_info);
2cefec773772 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");
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1722
	return err;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1723
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1724
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1725
/**
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1727
 * @adapter: board private structure
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1728
 *
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1729
 * Returns 0 on success, negative on failure
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1730
 **/
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1732
{
2cefec773772 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;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1734
	struct e1000_buffer *buffer_info;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1735
	int i, size, desc_len, err = -ENOMEM;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1736
2cefec773772 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;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1738
	rx_ring->buffer_info = vmalloc(size);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1739
	if (!rx_ring->buffer_info)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1740
		goto err;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1741
	memset(rx_ring->buffer_info, 0, size);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1742
2cefec773772 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++) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1744
		buffer_info = &rx_ring->buffer_info[i];
2cefec773772 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,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1746
						sizeof(struct e1000_ps_page),
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1747
						GFP_KERNEL);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1748
		if (!buffer_info->ps_pages)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1749
			goto err_pages;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1750
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1751
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1753
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1754
	/* Round up to nearest 4K */
2cefec773772 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;
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1757
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1759
	if (err)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1760
		goto err_pages;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1761
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1762
	rx_ring->next_to_clean = 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1763
	rx_ring->next_to_use = 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1764
	rx_ring->rx_skb_top = NULL;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1765
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1766
	return 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1767
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1768
err_pages:
2cefec773772 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++) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1770
		buffer_info = &rx_ring->buffer_info[i];
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1771
		kfree(buffer_info->ps_pages);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1772
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1773
err:
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1774
	vfree(rx_ring->buffer_info);
2cefec773772 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");
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1776
	return err;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1777
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1778
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1779
/**
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1780
 * e1000_clean_tx_ring - Free Tx Buffers
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1781
 * @adapter: board private structure
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1782
 **/
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1784
{
2cefec773772 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;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1786
	struct e1000_buffer *buffer_info;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1787
	unsigned long size;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1788
	unsigned int i;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1789
2cefec773772 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++) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1791
		buffer_info = &tx_ring->buffer_info[i];
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1792
		e1000_put_txbuf(adapter, buffer_info);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1793
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1794
2cefec773772 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;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1796
	memset(tx_ring->buffer_info, 0, size);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1797
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1799
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1800
	tx_ring->next_to_use = 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1801
	tx_ring->next_to_clean = 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1802
2cefec773772 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);
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1805
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1806
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1807
/**
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1809
 * @adapter: board private structure
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1810
 *
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1811
 * Free all transmit software resources
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1812
 **/
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1814
{
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1815
	struct pci_dev *pdev = adapter->pdev;
2cefec773772 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;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1817
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1818
	e1000_clean_tx_ring(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1819
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1820
	vfree(tx_ring->buffer_info);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1821
	tx_ring->buffer_info = NULL;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1822
2cefec773772 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,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1824
			  tx_ring->dma);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1825
	tx_ring->desc = NULL;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1826
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1827
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1828
/**
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1829
 * e1000e_free_rx_resources - Free Rx Resources
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1830
 * @adapter: board private structure
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1831
 *
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1832
 * Free all receive software resources
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1833
 **/
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1834
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1836
{
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1837
	struct pci_dev *pdev = adapter->pdev;
2cefec773772 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;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1839
	int i;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1840
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1841
	e1000_clean_rx_ring(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1842
2cefec773772 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++) {
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1845
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1846
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1847
	vfree(rx_ring->buffer_info);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1848
	rx_ring->buffer_info = NULL;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1849
2cefec773772 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,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1851
			  rx_ring->dma);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1852
	rx_ring->desc = NULL;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1853
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1854
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1855
/**
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1857
 * @adapter: pointer to adapter
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1858
 * @itr_setting: current adapter->itr
2cefec773772 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
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1861
 *
2cefec773772 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
2cefec773772 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
2cefec773772 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
2cefec773772 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
2cefec773772 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
2cefec773772 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
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1869
 *      by the InterruptThrottleRate module parameter.
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1870
 **/
2cefec773772 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,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1872
				     u16 itr_setting, int packets,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1873
				     int bytes)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1874
{
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1875
	unsigned int retval = itr_setting;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1876
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1877
	if (packets == 0)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1878
		goto update_itr_done;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1879
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1880
	switch (itr_setting) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1881
	case lowest_latency:
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1882
		/* handle TSO and jumbo frames */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1883
		if (bytes/packets > 8000)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1884
			retval = bulk_latency;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1885
		else if ((packets < 5) && (bytes > 512)) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1886
			retval = low_latency;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1887
		}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1888
		break;
2cefec773772 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 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1890
		if (bytes > 10000) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1891
			/* this if handles the TSO accounting */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1892
			if (bytes/packets > 8000) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1893
				retval = bulk_latency;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1894
			} else if ((packets < 10) || ((bytes/packets) > 1200)) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1895
				retval = bulk_latency;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1896
			} else if ((packets > 35)) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1897
				retval = lowest_latency;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1898
			}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1899
		} else if (bytes/packets > 2000) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1900
			retval = bulk_latency;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1901
		} else if (packets <= 2 && bytes < 512) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1902
			retval = lowest_latency;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1903
		}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1904
		break;
2cefec773772 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 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1906
		if (bytes > 25000) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1907
			if (packets > 35) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1908
				retval = low_latency;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1909
			}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1910
		} else if (bytes < 6000) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1911
			retval = low_latency;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1912
		}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1913
		break;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1914
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1915
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1916
update_itr_done:
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1917
	return retval;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1918
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1919
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1921
{
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1922
	struct e1000_hw *hw = &adapter->hw;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1923
	u16 current_itr;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1924
	u32 new_itr = adapter->itr;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1925
2cefec773772 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 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1927
	if (adapter->link_speed != SPEED_1000) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1928
		current_itr = 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1929
		new_itr = 4000;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1930
		goto set_itr_now;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1931
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1932
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1933
	adapter->tx_itr = e1000_update_itr(adapter,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1934
				    adapter->tx_itr,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1935
				    adapter->total_tx_packets,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1936
				    adapter->total_tx_bytes);
2cefec773772 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 */
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1939
		adapter->tx_itr = low_latency;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1940
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1941
	adapter->rx_itr = e1000_update_itr(adapter,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1942
				    adapter->rx_itr,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1943
				    adapter->total_rx_packets,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1944
				    adapter->total_rx_bytes);
2cefec773772 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 */
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1947
		adapter->rx_itr = low_latency;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1948
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1950
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1951
	switch (current_itr) {
2cefec773772 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 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1953
	case lowest_latency:
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1954
		new_itr = 70000;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1955
		break;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1956
	case low_latency:
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1957
		new_itr = 20000; /* aka hwitr = ~200 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1958
		break;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1959
	case bulk_latency:
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1960
		new_itr = 4000;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1961
		break;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1962
	default:
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1963
		break;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1964
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1965
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1966
set_itr_now:
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1967
	if (new_itr != adapter->itr) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1968
		/*
2cefec773772 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
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1971
		 * increasing
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1972
		 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1973
		new_itr = new_itr > adapter->itr ?
2cefec773772 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) :
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1975
			     new_itr;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1976
		adapter->itr = new_itr;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1977
		adapter->rx_ring->itr_val = new_itr;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1978
		if (adapter->msix_entries)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1979
			adapter->rx_ring->set_itr = 1;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1980
		else
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1981
			ew32(ITR, 1000000000 / (new_itr * 256));
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1982
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1983
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1984
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1985
/**
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1987
 * @adapter: board private structure to initialize
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1988
 **/
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1990
{
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1992
	if (!adapter->tx_ring)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1993
		goto err;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1994
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1996
	if (!adapter->rx_ring)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1997
		goto err;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1998
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1999
	return 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2000
err:
2cefec773772 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");
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2002
	kfree(adapter->rx_ring);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2003
	kfree(adapter->tx_ring);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2004
	return -ENOMEM;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2005
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2006
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2007
/**
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2008
 * e1000_clean - NAPI Rx polling callback
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2009
 * @napi: struct associated with this polling callback
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2011
 **/
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2013
{
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2015
	struct e1000_hw *hw = &adapter->hw;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2016
	struct net_device *poll_dev = adapter->netdev;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2017
	int tx_cleaned = 1, work_done = 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2018
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2019
	adapter = netdev_priv(poll_dev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2020
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2021
	if (adapter->msix_entries &&
2cefec773772 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))
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2023
		goto clean_rx;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2024
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2025
	tx_cleaned = e1000_clean_tx_irq(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2026
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2027
clean_rx:
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2028
	adapter->clean_rx(adapter, &work_done, budget);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2029
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2030
	if (!tx_cleaned)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2031
		work_done = budget;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2032
2cefec773772 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 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2034
	if (work_done < budget) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2035
		if (adapter->itr_setting & 3)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2036
			e1000_set_itr(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2037
		napi_complete(napi);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2038
		if (!test_bit(__E1000_DOWN, &adapter->state)) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2039
			if (adapter->msix_entries)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2040
				ew32(IMS, adapter->rx_ring->ims_val);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2041
			else
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2042
				e1000_irq_enable(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2043
		}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2044
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2045
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2046
	return work_done;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2047
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2048
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2050
{
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2051
	struct e1000_adapter *adapter = netdev_priv(netdev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2052
	struct e1000_hw *hw = &adapter->hw;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2053
	u32 vfta, index;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2054
2cefec773772 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 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2056
	if ((adapter->hw.mng_cookie.status &
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2057
	     E1000_MNG_DHCP_COOKIE_STATUS_VLAN) &&
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2058
	    (vid == adapter->mng_vlan_id))
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2059
		return;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2060
	/* add VID to filter table */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2061
	index = (vid >> 5) & 0x7F;
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2063
	vfta |= (1 << (vid & 0x1F));
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2064
	e1000e_write_vfta(hw, index, vfta);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2065
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2066
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2068
{
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2069
	struct e1000_adapter *adapter = netdev_priv(netdev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2070
	struct e1000_hw *hw = &adapter->hw;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2071
	u32 vfta, index;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2072
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2073
	if (!test_bit(__E1000_DOWN, &adapter->state))
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2074
		e1000_irq_disable(adapter);
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2076
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2077
	if (!test_bit(__E1000_DOWN, &adapter->state))
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2078
		e1000_irq_enable(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2079
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2080
	if ((adapter->hw.mng_cookie.status &
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2081
	     E1000_MNG_DHCP_COOKIE_STATUS_VLAN) &&
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2082
	    (vid == adapter->mng_vlan_id)) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2083
		/* release control to f/w */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2084
		e1000_release_hw_control(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2085
		return;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2086
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2087
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2088
	/* remove VID from filter table */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2089
	index = (vid >> 5) & 0x7F;
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2091
	vfta &= ~(1 << (vid & 0x1F));
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2092
	e1000e_write_vfta(hw, index, vfta);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2093
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2094
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2096
{
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2097
	struct net_device *netdev = adapter->netdev;
2cefec773772 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;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2099
	u16 old_vid = adapter->mng_vlan_id;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2100
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2101
	if (!adapter->vlgrp)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2102
		return;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2103
2cefec773772 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)) {
2cefec773772 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;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2106
		if (adapter->hw.mng_cookie.status &
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2107
			E1000_MNG_DHCP_COOKIE_STATUS_VLAN) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2108
			e1000_vlan_rx_add_vid(netdev, vid);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2109
			adapter->mng_vlan_id = vid;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2110
		}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2111
2cefec773772 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) &&
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2113
				(vid != old_vid) &&
2cefec773772 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))
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2116
	} else {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2117
		adapter->mng_vlan_id = vid;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2118
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2119
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2120
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2121
2cefec773772 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,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2123
				   struct vlan_group *grp)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2124
{
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2125
	struct e1000_adapter *adapter = netdev_priv(netdev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2126
	struct e1000_hw *hw = &adapter->hw;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2127
	u32 ctrl, rctl;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2128
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2129
	if (!test_bit(__E1000_DOWN, &adapter->state))
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2130
		e1000_irq_disable(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2131
	adapter->vlgrp = grp;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2132
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2133
	if (grp) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2134
		/* enable VLAN tag insert/strip */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2135
		ctrl = er32(CTRL);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2136
		ctrl |= E1000_CTRL_VME;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2137
		ew32(CTRL, ctrl);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2138
2cefec773772 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) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2140
			/* enable VLAN receive filtering */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2141
			rctl = er32(RCTL);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2142
			rctl &= ~E1000_RCTL_CFIEN;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2143
			ew32(RCTL, rctl);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2144
			e1000_update_mng_vlan(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2145
		}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2146
	} else {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2147
		/* disable VLAN tag insert/strip */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2148
		ctrl = er32(CTRL);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2149
		ctrl &= ~E1000_CTRL_VME;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2150
		ew32(CTRL, ctrl);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2151
2cefec773772 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) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2153
			if (adapter->mng_vlan_id !=
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2154
			    (u16)E1000_MNG_VLAN_NONE) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2155
				e1000_vlan_rx_kill_vid(netdev,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2156
						       adapter->mng_vlan_id);
2cefec773772 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;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2158
			}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2159
		}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2160
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2161
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2162
	if (!test_bit(__E1000_DOWN, &adapter->state))
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2163
		e1000_irq_enable(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2164
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2165
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2167
{
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2168
	u16 vid;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2169
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2171
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2172
	if (!adapter->vlgrp)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2173
		return;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2174
2cefec773772 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++) {
2cefec773772 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))
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2177
			continue;
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2179
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2180
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2181
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2183
{
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2184
	struct e1000_hw *hw = &adapter->hw;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2185
	u32 manc, manc2h;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2186
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2187
	if (!(adapter->flags & FLAG_MNG_PT_ENABLED))
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2188
		return;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2189
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2190
	manc = er32(MANC);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2191
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2192
	/*
2cefec773772 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
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2195
	 * the packets will be handled on SMBUS
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2196
	 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2197
	manc |= E1000_MANC_EN_MNG2HOST;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2198
	manc2h = er32(MANC2H);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2199
#define E1000_MNG2HOST_PORT_623 (1 << 5)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2200
#define E1000_MNG2HOST_PORT_664 (1 << 6)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2201
	manc2h |= E1000_MNG2HOST_PORT_623;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2202
	manc2h |= E1000_MNG2HOST_PORT_664;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2203
	ew32(MANC2H, manc2h);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2204
	ew32(MANC, manc);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2205
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2206
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2207
/**
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2209
 * @adapter: board private structure
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2210
 *
2cefec773772 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.
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2212
 **/
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2214
{
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2215
	struct e1000_hw *hw = &adapter->hw;
2cefec773772 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;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2217
	u64 tdba;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2218
	u32 tdlen, tctl, tipg, tarc;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2219
	u32 ipgr1, ipgr2;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2220
2cefec773772 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 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2222
	tdba = tx_ring->dma;
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2224
	ew32(TDBAL, (tdba & DMA_BIT_MASK(32)));
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2225
	ew32(TDBAH, (tdba >> 32));
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2226
	ew32(TDLEN, tdlen);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2227
	ew32(TDH, 0);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2228
	ew32(TDT, 0);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2229
	tx_ring->head = E1000_TDH;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2230
	tx_ring->tail = E1000_TDT;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2231
2cefec773772 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 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2233
	tipg = DEFAULT_82543_TIPG_IPGT_COPPER;          /*  8  */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2234
	ipgr1 = DEFAULT_82543_TIPG_IPGR1;               /*  8  */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2235
	ipgr2 = DEFAULT_82543_TIPG_IPGR2;               /*  6  */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2236
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2238
		ipgr2 = DEFAULT_80003ES2LAN_TIPG_IPGR2; /*  7  */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2239
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2240
	tipg |= ipgr1 << E1000_TIPG_IPGR1_SHIFT;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2241
	tipg |= ipgr2 << E1000_TIPG_IPGR2_SHIFT;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2242
	ew32(TIPG, tipg);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2243
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2244
	/* Set the Tx Interrupt Delay register */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2245
	ew32(TIDV, adapter->tx_int_delay);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2246
	/* Tx irq moderation */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2247
	ew32(TADV, adapter->tx_abs_int_delay);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2248
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2249
	/* Program the Transmit Control Register */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2250
	tctl = er32(TCTL);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2251
	tctl &= ~E1000_TCTL_CT;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2252
	tctl |= E1000_TCTL_PSP | E1000_TCTL_RTLC |
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2253
		(E1000_COLLISION_THRESHOLD << E1000_CT_SHIFT);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2254
2cefec773772 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) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2256
		tarc = er32(TARC(0));
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2257
		/*
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2259
		 * gigabit link later
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2260
		 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2261
#define SPEED_MODE_BIT (1 << 21)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2262
		tarc |= SPEED_MODE_BIT;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2263
		ew32(TARC(0), tarc);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2264
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2265
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2266
	/* errata: program both queues to unweighted RR */
2cefec773772 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) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2268
		tarc = er32(TARC(0));
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2269
		tarc |= 1;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2270
		ew32(TARC(0), tarc);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2271
		tarc = er32(TARC(1));
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2272
		tarc |= 1;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2273
		ew32(TARC(1), tarc);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2274
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2275
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2276
	/* Setup Transmit Descriptor Settings for eop descriptor */
2cefec773772 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;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2278
2cefec773772 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 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2280
	if (adapter->tx_int_delay)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2281
		adapter->txd_cmd |= E1000_TXD_CMD_IDE;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2282
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2283
	/* enable Report Status bit */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2284
	adapter->txd_cmd |= E1000_TXD_CMD_RS;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2285
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2286
	ew32(TCTL, tctl);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2287
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2288
	e1000e_config_collision_dist(hw);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2289
2cefec773772 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;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2291
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2292
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2293
/**
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2295
 * @adapter: Board private structure
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2296
 **/
2cefec773772 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) + \
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2298
			   (((S) & (PAGE_SIZE - 1)) ? 1 : 0))
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2300
{
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2301
	struct e1000_hw *hw = &adapter->hw;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2302
	u32 rctl, rfctl;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2303
	u32 psrctl = 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2304
	u32 pages = 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2305
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2306
	/* Program MC offset vector base */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2307
	rctl = er32(RCTL);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2308
	rctl &= ~(3 << E1000_RCTL_MO_SHIFT);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2309
	rctl |= E1000_RCTL_EN | E1000_RCTL_BAM |
2cefec773772 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 |
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2312
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2313
	/* Do not Store bad packets */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2314
	rctl &= ~E1000_RCTL_SBP;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2315
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2316
	/* Enable Long Packet receive */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2317
	if (adapter->netdev->mtu <= ETH_DATA_LEN)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2318
		rctl &= ~E1000_RCTL_LPE;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2319
	else
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2320
		rctl |= E1000_RCTL_LPE;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2321
2cefec773772 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
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2324
	 * host memory when this is enabled
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2325
	 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2326
	if (adapter->flags2 & FLAG2_CRC_STRIPPING)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2327
		rctl |= E1000_RCTL_SECRC;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2328
2cefec773772 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 */
2cefec773772 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)) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2331
		u16 phy_data;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2332
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2334
		phy_data &= 0xfff8;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2335
		phy_data |= (1 << 2);
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2337
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2338
		e1e_rphy(hw, 22, &phy_data);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2339
		phy_data &= 0x0fff;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2340
		phy_data |= (1 << 14);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2341
		e1e_wphy(hw, 0x10, 0x2823);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2342
		e1e_wphy(hw, 0x11, 0x0003);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2343
		e1e_wphy(hw, 22, phy_data);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2344
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2345
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2346
	/* Setup buffer sizes */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2347
	rctl &= ~E1000_RCTL_SZ_4096;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2348
	rctl |= E1000_RCTL_BSEX;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2349
	switch (adapter->rx_buffer_len) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2350
	case 2048:
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2351
	default:
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2352
		rctl |= E1000_RCTL_SZ_2048;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2353
		rctl &= ~E1000_RCTL_BSEX;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2354
		break;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2355
	case 4096:
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2356
		rctl |= E1000_RCTL_SZ_4096;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2357
		break;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2358
	case 8192:
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2359
		rctl |= E1000_RCTL_SZ_8192;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2360
		break;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2361
	case 16384:
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2362
		rctl |= E1000_RCTL_SZ_16384;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2363
		break;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2364
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2365
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2366
	/*
2cefec773772 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
2cefec773772 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
2cefec773772 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.
2cefec773772 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,
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2372
	 * sized to hold the largest protocol header.
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2373
	 *
2cefec773772 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
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2376
	 *
2cefec773772 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
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2379
	 * per packet.
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2380
	 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2381
	pages = PAGE_USE_COUNT(adapter->netdev->mtu);
2cefec773772 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) &&
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2383
	    (PAGE_SIZE <= 16384) && (rctl & E1000_RCTL_LPE))
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2384
		adapter->rx_ps_pages = pages;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2385
	else
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2386
		adapter->rx_ps_pages = 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2387
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2388
	if (adapter->rx_ps_pages) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2389
		/* Configure extra packet-split registers */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2390
		rfctl = er32(RFCTL);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2391
		rfctl |= E1000_RFCTL_EXTEN;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2392
		/*
2cefec773772 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,
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2395
		 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2396
		rfctl |= (E1000_RFCTL_IPV6_EX_DIS |
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2397
			  E1000_RFCTL_NEW_IPV6_EXT_DIS);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2398
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2399
		ew32(RFCTL, rfctl);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2400
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2401
		/* Enable Packet split descriptors */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2402
		rctl |= E1000_RCTL_DTYP_PS;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2403
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2404
		psrctl |= adapter->rx_ps_bsize0 >>
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2405
			E1000_PSRCTL_BSIZE0_SHIFT;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2406
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2407
		switch (adapter->rx_ps_pages) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2408
		case 3:
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2409
			psrctl |= PAGE_SIZE <<
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2410
				E1000_PSRCTL_BSIZE3_SHIFT;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2411
		case 2:
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2412
			psrctl |= PAGE_SIZE <<
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2413
				E1000_PSRCTL_BSIZE2_SHIFT;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2414
		case 1:
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2415
			psrctl |= PAGE_SIZE >>
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2416
				E1000_PSRCTL_BSIZE1_SHIFT;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2417
			break;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2418
		}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2419
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2420
		ew32(PSRCTL, psrctl);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2421
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2422
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2423
	ew32(RCTL, rctl);
2cefec773772 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 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2425
	adapter->flags &= ~FLAG_RX_RESTART_NOW;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2426
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2427
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2428
/**
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2430
 * @adapter: board private structure
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2431
 *
2cefec773772 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.
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2433
 **/
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2435
{
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2436
	struct e1000_hw *hw = &adapter->hw;
2cefec773772 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;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2438
	u64 rdba;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2439
	u32 rdlen, rctl, rxcsum, ctrl_ext;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2440
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2441
	if (adapter->rx_ps_pages) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2442
		/* this is a 32 byte descriptor */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2443
		rdlen = rx_ring->count *
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2444
			sizeof(union e1000_rx_desc_packet_split);
2cefec773772 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;
2cefec773772 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;
2cefec773772 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) {
2cefec773772 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);
2cefec773772 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;
2cefec773772 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;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2451
	} else {
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2453
		adapter->clean_rx = e1000_clean_rx_irq;
2cefec773772 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;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2455
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2456
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2457
	/* disable receives while setting up the descriptors */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2458
	rctl = er32(RCTL);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2459
	ew32(RCTL, rctl & ~E1000_RCTL_EN);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2460
	e1e_flush();
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2461
	msleep(10);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2462
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2463
	/* set the Receive Delay Timer Register */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2464
	ew32(RDTR, adapter->rx_int_delay);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2465
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2466
	/* irq moderation */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2467
	ew32(RADV, adapter->rx_abs_int_delay);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2468
	if (adapter->itr_setting != 0)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2469
		ew32(ITR, 1000000000 / (adapter->itr * 256));
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2470
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2471
	ctrl_ext = er32(CTRL_EXT);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2472
	/* Reset delay timers after every interrupt */
2cefec773772 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;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2474
	/* Auto-Mask interrupts upon ICR access */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2475
	ctrl_ext |= E1000_CTRL_EXT_IAME;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2476
	ew32(IAM, 0xffffffff);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2477
	ew32(CTRL_EXT, ctrl_ext);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2478
	e1e_flush();
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2479
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2480
	/*
2cefec773772 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
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2483
	 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2484
	rdba = rx_ring->dma;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2485
	ew32(RDBAL, (rdba & DMA_BIT_MASK(32)));
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2486
	ew32(RDBAH, (rdba >> 32));
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2487
	ew32(RDLEN, rdlen);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2488
	ew32(RDH, 0);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2489
	ew32(RDT, 0);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2490
	rx_ring->head = E1000_RDH;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2491
	rx_ring->tail = E1000_RDT;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2492
2cefec773772 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 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2494
	rxcsum = er32(RXCSUM);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2495
	if (adapter->flags & FLAG_RX_CSUM_ENABLED) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2496
		rxcsum |= E1000_RXCSUM_TUOFL;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2497
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2498
		/*
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2500
		 * used in conjunction with packet-split.
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2501
		 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2502
		if (adapter->rx_ps_pages)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2503
			rxcsum |= E1000_RXCSUM_IPPCSE;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2504
	} else {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2505
		rxcsum &= ~E1000_RXCSUM_TUOFL;
2cefec773772 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 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2507
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2508
	ew32(RXCSUM, rxcsum);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2509
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2510
	/*
2cefec773772 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
2cefec773772 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
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2514
	 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2515
	if ((adapter->flags & FLAG_HAS_ERT) &&
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2516
	    (adapter->netdev->mtu > ETH_DATA_LEN)) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2517
		u32 rxdctl = er32(RXDCTL(0));
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2518
		ew32(RXDCTL(0), rxdctl | 0x3);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2519
		ew32(ERT, E1000_ERT_2048 | (1 << 13));
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2520
		/*
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2522
		 * C4->C2 latencies result in dropped transactions.
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2523
		 */
2cefec773772 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,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2525
					  e1000e_driver_name, 55);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2526
	} else {
2cefec773772 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,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2528
					  e1000e_driver_name,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2529
					  PM_QOS_DEFAULT_VALUE);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2530
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2531
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2532
	/* Enable Receives */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2533
	ew32(RCTL, rctl);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2534
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2535
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2536
/**
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2538
 *  @hw: pointer to the HW structure
2cefec773772 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
2cefec773772 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
2cefec773772 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
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2543
 *
2cefec773772 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.
2cefec773772 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.
2cefec773772 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
2cefec773772 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
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2549
 *  function.
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2550
 **/
2cefec773772 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,
2cefec773772 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,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2553
				      u32 rar_count)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2554
{
2cefec773772 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,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2556
				        rar_used_count, rar_count);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2557
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2558
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2559
/**
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2561
 * @netdev: network interface device structure
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2562
 *
2cefec773772 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
2cefec773772 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
2cefec773772 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,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2566
 * promiscuous mode, and all-multi behavior.
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2567
 **/
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2569
{
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2570
	struct e1000_adapter *adapter = netdev_priv(netdev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2571
	struct e1000_hw *hw = &adapter->hw;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2572
	struct e1000_mac_info *mac = &hw->mac;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2573
	struct dev_mc_list *mc_ptr;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2574
	u8  *mta_list;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2575
	u32 rctl;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2576
	int i;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2577
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2578
	/* Check for Promiscuous and All Multicast modes */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2579
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2580
	rctl = er32(RCTL);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2581
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2582
	if (netdev->flags & IFF_PROMISC) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2583
		rctl |= (E1000_RCTL_UPE | E1000_RCTL_MPE);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2584
		rctl &= ~E1000_RCTL_VFE;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2585
	} else {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2586
		if (netdev->flags & IFF_ALLMULTI) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2587
			rctl |= E1000_RCTL_MPE;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2588
			rctl &= ~E1000_RCTL_UPE;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2589
		} else {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2590
			rctl &= ~(E1000_RCTL_UPE | E1000_RCTL_MPE);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2591
		}
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2593
			rctl |= E1000_RCTL_VFE;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2594
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2595
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2596
	ew32(RCTL, rctl);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2597
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2598
	if (netdev->mc_count) {
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2600
		if (!mta_list)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2601
			return;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2602
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2603
		/* prepare a packed array of only addresses. */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2604
		mc_ptr = netdev->mc_list;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2605
2cefec773772 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++) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2607
			if (!mc_ptr)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2608
				break;
2cefec773772 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,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2610
			       ETH_ALEN);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2611
			mc_ptr = mc_ptr->next;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2612
		}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2613
2cefec773772 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,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2615
					  mac->rar_entry_count);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2616
		kfree(mta_list);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2617
	} else {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2618
		/*
2cefec773772 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
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2621
		 */
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2623
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2624
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2625
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2626
/**
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2628
 * @adapter: private board structure
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2629
 **/
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2631
{
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2632
	e1000_set_multi(adapter->netdev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2633
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2634
	e1000_restore_vlan(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2635
	e1000_init_manageability(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2636
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2637
	e1000_configure_tx(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2638
	e1000_setup_rctl(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2639
	e1000_configure_rx(adapter);
2cefec773772 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));
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2641
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2642
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2643
/**
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2645
 * @adapter: address of board private structure
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2646
 *
2cefec773772 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
2cefec773772 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)
2cefec773772 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 ***
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2650
 **/
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2652
{
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2653
	u16 mii_reg = 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2654
2cefec773772 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 */
2cefec773772 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) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2657
		/*
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2659
		 * settings across a power-down/up cycle
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2660
		 */
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2662
		mii_reg &= ~MII_CR_POWER_DOWN;
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2664
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2665
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2667
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2668
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2669
/**
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2671
 *
2cefec773772 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
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2674
 */
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2676
{
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2677
	struct e1000_hw *hw = &adapter->hw;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2678
	u16 mii_reg;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2679
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2680
	/* WoL is enabled */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2681
	if (adapter->wol)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2682
		return;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2683
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2684
	/* non-copper PHY? */
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2686
		return;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2687
2cefec773772 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 */
2cefec773772 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))
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2690
		return;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2691
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2692
	/* manageability (AMT) is enabled */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2693
	if (er32(MANC) & E1000_MANC_SMBUS_EN)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2694
		return;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2695
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2696
	/* power down the PHY */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2697
	e1e_rphy(hw, PHY_CONTROL, &mii_reg);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2698
	mii_reg |= MII_CR_POWER_DOWN;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2699
	e1e_wphy(hw, PHY_CONTROL, mii_reg);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2700
	mdelay(1);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2701
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2702
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2703
/**
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2705
 *
2cefec773772 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
2cefec773772 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
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2709
 * properly configured for Rx, Tx etc.
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2710
 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2711
void e1000e_reset(struct e1000_adapter *adapter)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2712
{
2cefec773772 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;
2cefec773772 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;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2715
	struct e1000_hw *hw = &adapter->hw;
2cefec773772 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;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2717
	u32 pba = adapter->pba;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2718
	u16 hwm;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2719
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2720
	/* reset Packet Buffer Allocation to default */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2721
	ew32(PBA, pba);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2722
2cefec773772 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) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2724
		/*
2cefec773772 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
2cefec773772 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,
2cefec773772 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,
2cefec773772 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
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2730
		 * expressed in KB.
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2731
		 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2732
		pba = er32(PBA);
2cefec773772 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 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2734
		tx_space = pba >> 16;
2cefec773772 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 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2736
		pba &= 0xffff;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2737
		/*
2cefec773772 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
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2740
		 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2741
		min_tx_space = (adapter->max_frame_size +
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2742
				sizeof(struct e1000_tx_desc) -
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2743
				ETH_FCS_LEN) * 2;
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2745
		min_tx_space >>= 10;
2cefec773772 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 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2747
		min_rx_space = adapter->max_frame_size;
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2749
		min_rx_space >>= 10;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2750
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2751
		/*
2cefec773772 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,
2cefec773772 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
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2755
		 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2756
		if ((tx_space < min_tx_space) &&
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2757
		    ((min_tx_space - tx_space) < pba)) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2758
			pba -= min_tx_space - tx_space;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2759
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2760
			/*
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2762
			 * adjustment or use Early Receive if available
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2763
			 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2764
			if ((pba < min_rx_space) &&
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2765
			    (!(adapter->flags & FLAG_HAS_ERT)))
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2766
				/* ERT enabled in e1000_configure_rx */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2767
				pba = min_rx_space;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2768
		}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2769
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2770
		ew32(PBA, pba);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2771
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2772
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2773
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2774
	/*
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2775
	 * flow control settings
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2776
	 *
2cefec773772 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
2cefec773772 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.
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2779
	 * Set it to the lower of:
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2780
	 * - 90% of the Rx FIFO size, and
2cefec773772 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
2cefec773772 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
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2784
	 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2785
	if (hw->mac.type == e1000_pchlan) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2786
		/*
2cefec773772 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
2cefec773772 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.
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2789
		 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2790
		if (adapter->netdev->mtu > ETH_DATA_LEN) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2791
			fc->high_water = 0x3500;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2792
			fc->low_water  = 0x1500;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2793
		} else {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2794
			fc->high_water = 0x5000;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2795
			fc->low_water  = 0x3000;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2796
		}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2797
	} else {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2798
		if ((adapter->flags & FLAG_HAS_ERT) &&
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2799
		    (adapter->netdev->mtu > ETH_DATA_LEN))
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2800
			hwm = min(((pba << 10) * 9 / 10),
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2801
				  ((pba << 10) - (E1000_ERT_2048 << 3)));
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2802
		else
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2803
			hwm = min(((pba << 10) * 9 / 10),
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2804
				  ((pba << 10) - adapter->max_frame_size));
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2805
2cefec773772 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 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2807
		fc->low_water = fc->high_water - 8;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2808
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2809
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2811
		fc->pause_time = 0xFFFF;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2812
	else
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2813
		fc->pause_time = E1000_FC_PAUSE_TIME;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2814
	fc->send_xon = 1;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2815
	fc->current_mode = fc->requested_mode;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2816
2cefec773772 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 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2818
	mac->ops.reset_hw(hw);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2819
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2820
	/*
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2822
	 * that the network interface is in control
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2823
	 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2824
	if (adapter->flags & FLAG_HAS_AMT)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2825
		e1000_get_hw_control(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2826
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2827
	ew32(WUC, 0);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2828
	if (adapter->flags2 & FLAG2_HAS_PHY_WAKEUP)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2829
		e1e_wphy(&adapter->hw, BM_WUC, 0);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2830
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2831
	if (mac->ops.init_hw(hw))
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2832
		e_err("Hardware Error\n");
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2833
2cefec773772 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 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2835
	if (hw->mac.type == e1000_pchlan)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2836
		ew32(FCRTV_PCH, 0x1000);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2837
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2838
	e1000_update_mng_vlan(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2839
2cefec773772 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 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2841
	ew32(VET, ETH_P_8021Q);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2842
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2843
	e1000e_reset_adaptive(hw);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2844
	e1000_get_phy_info(hw);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2845
2cefec773772 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) &&
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2847
	    !(adapter->flags & FLAG_SMART_POWER_DOWN)) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2848
		u16 phy_data = 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2849
		/*
2cefec773772 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
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2852
		 * different we would do if it failed
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2853
		 */
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2855
		phy_data &= ~IGP02E1000_PM_SPD;
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2857
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2858
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2859
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2860
int e1000e_up(struct e1000_adapter *adapter)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2861
{
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2862
	struct e1000_hw *hw = &adapter->hw;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2863
2cefec773772 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 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2865
	e1000_configure(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2866
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2867
	clear_bit(__E1000_DOWN, &adapter->state);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2868
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2869
	napi_enable(&adapter->napi);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2870
	if (adapter->msix_entries)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2871
		e1000_configure_msix(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2872
	e1000_irq_enable(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2873
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2874
	netif_wake_queue(adapter->netdev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2875
2cefec773772 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 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2877
	ew32(ICS, E1000_ICS_LSC);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2878
	return 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2879
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2880
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2881
void e1000e_down(struct e1000_adapter *adapter)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2882
{
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2883
	struct net_device *netdev = adapter->netdev;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2884
	struct e1000_hw *hw = &adapter->hw;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2885
	u32 tctl, rctl;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2886
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2887
	/*
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2889
	 * reschedule our watchdog timer
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2890
	 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2891
	set_bit(__E1000_DOWN, &adapter->state);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2892
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2893
	/* disable receives in the hardware */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2894
	rctl = er32(RCTL);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2895
	ew32(RCTL, rctl & ~E1000_RCTL_EN);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2896
	/* flush and sleep below */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2897
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2898
	netif_stop_queue(netdev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2899
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2900
	/* disable transmits in the hardware */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2901
	tctl = er32(TCTL);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2902
	tctl &= ~E1000_TCTL_EN;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2903
	ew32(TCTL, tctl);
2cefec773772 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 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2905
	e1e_flush();
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2906
	msleep(10);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2907
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2908
	napi_disable(&adapter->napi);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2909
	e1000_irq_disable(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2910
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2911
	del_timer_sync(&adapter->watchdog_timer);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2912
	del_timer_sync(&adapter->phy_info_timer);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2913
2cefec773772 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;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2915
	netif_carrier_off(netdev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2916
	adapter->link_speed = 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2917
	adapter->link_duplex = 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2918
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2919
	if (!pci_channel_offline(adapter->pdev))
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2920
		e1000e_reset(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2921
	e1000_clean_tx_ring(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2922
	e1000_clean_rx_ring(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2923
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2924
	/*
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2926
	 * pci_disable_device here.
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2927
	 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2928
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2929
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2931
{
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2932
	might_sleep();
2cefec773772 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))
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2934
		msleep(1);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2935
	e1000e_down(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2936
	e1000e_up(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2937
	clear_bit(__E1000_RESETTING, &adapter->state);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2938
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2939
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2940
/**
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2942
 * @adapter: board private structure to initialize
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2943
 *
2cefec773772 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.
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2946
 * OS network device settings (MTU size).
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2947
 **/
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2949
{
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2950
	struct net_device *netdev = adapter->netdev;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2951
2cefec773772 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;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2953
	adapter->rx_ps_bsize0 = 128;
2cefec773772 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;
2cefec773772 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;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2956
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2957
	e1000e_set_interrupt_capability(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2958
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2959
	if (e1000_alloc_queues(adapter))
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2960
		return -ENOMEM;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2961
2cefec773772 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. */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2963
	e1000_irq_disable(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2964
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2965
	set_bit(__E1000_DOWN, &adapter->state);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2966
	return 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2967
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2968
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2969
/**
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2970
 * e1000_intr_msi_test - Interrupt Handler
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2971
 * @irq: interrupt number
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2973
 **/
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2975
{
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2976
	struct net_device *netdev = data;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2977
	struct e1000_adapter *adapter = netdev_priv(netdev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2978
	struct e1000_hw *hw = &adapter->hw;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2979
	u32 icr = er32(ICR);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2980
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2982
	if (icr & E1000_ICR_RXSEQ) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2983
		adapter->flags &= ~FLAG_MSI_TEST_FAILED;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2984
		wmb();
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2985
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2986
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2987
	return IRQ_HANDLED;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2988
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2989
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2990
/**
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2992
 * @adapter: board private struct
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2993
 *
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2994
 * code flow taken from tg3.c
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2995
 **/
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2997
{
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2998
	struct net_device *netdev = adapter->netdev;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2999
	struct e1000_hw *hw = &adapter->hw;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3000
	int err;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3001
2cefec773772 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 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3003
	/* clear any pending events */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3004
	er32(ICR);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3005
2cefec773772 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 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3007
	e1000_free_irq(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3008
	e1000e_reset_interrupt_capability(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3009
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3011
	 * MSI irq handler will unset this flag */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3012
	adapter->flags |= FLAG_MSI_TEST_FAILED;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3013
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3014
	err = pci_enable_msi(adapter->pdev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3015
	if (err)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3016
		goto msi_test_failed;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3017
2cefec773772 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,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3019
			  netdev->name, netdev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3020
	if (err) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3021
		pci_disable_msi(adapter->pdev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3022
		goto msi_test_failed;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3023
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3024
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3025
	wmb();
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3026
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3027
	e1000_irq_enable(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3028
2cefec773772 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 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3030
	ew32(ICS, E1000_ICS_RXSEQ);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3031
	e1e_flush();
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3032
	msleep(50);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3033
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3034
	e1000_irq_disable(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3035
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3036
	rmb();
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3037
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3038
	if (adapter->flags & FLAG_MSI_TEST_FAILED) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3039
		adapter->int_mode = E1000E_INT_MODE_LEGACY;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3040
		err = -EIO;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3041
		e_info("MSI interrupt test failed!\n");
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3042
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3043
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3044
	free_irq(adapter->pdev->irq, netdev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3045
	pci_disable_msi(adapter->pdev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3046
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3047
	if (err == -EIO)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3048
		goto msi_test_failed;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3049
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3050
	/* okay so the test worked, restore settings */
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3052
msi_test_failed:
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3053
	e1000e_set_interrupt_capability(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3054
	e1000_request_irq(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3055
	return err;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3056
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3057
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3058
/**
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3060
 * @adapter: board private struct
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3061
 *
2cefec773772 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.
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3063
 **/
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3065
{
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3066
	int err;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3067
	u16 pci_cmd;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3068
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3069
	if (!(adapter->flags & FLAG_MSI_ENABLED))
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3070
		return 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3071
2cefec773772 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 */
2cefec773772 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);
2cefec773772 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,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3075
			      pci_cmd & ~PCI_COMMAND_SERR);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3076
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3077
	err = e1000_test_msi_interrupt(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3078
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3079
	/* restore previous setting of command word */
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3081
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3082
	/* success ! */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3083
	if (!err)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3084
		return 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3085
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3086
	/* EIO means MSI test failed */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3087
	if (err != -EIO)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3088
		return err;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3089
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3090
	/* back to INTx mode */
2cefec773772 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");
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3092
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3093
	e1000_free_irq(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3094
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3095
	err = e1000_request_irq(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3096
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3097
	return err;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3098
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3099
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3100
/**
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3102
 * @netdev: network interface device structure
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3103
 *
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3105
 *
2cefec773772 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
2cefec773772 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
2cefec773772 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
2cefec773772 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,
2cefec773772 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.
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3111
 **/
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3113
{
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3114
	struct e1000_adapter *adapter = netdev_priv(netdev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3115
	struct e1000_hw *hw = &adapter->hw;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3116
	int err;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3117
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3118
	/* disallow open during test */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3119
	if (test_bit(__E1000_TESTING, &adapter->state))
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3120
		return -EBUSY;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3121
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3122
	netif_carrier_off(netdev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3123
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3124
	/* allocate transmit descriptors */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3125
	err = e1000e_setup_tx_resources(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3126
	if (err)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3127
		goto err_setup_tx;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3128
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3129
	/* allocate receive descriptors */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3130
	err = e1000e_setup_rx_resources(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3131
	if (err)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3132
		goto err_setup_rx;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3133
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3134
	e1000e_power_up_phy(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3135
2cefec773772 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;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3137
	if ((adapter->hw.mng_cookie.status &
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3138
	     E1000_MNG_DHCP_COOKIE_STATUS_VLAN))
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3139
		e1000_update_mng_vlan(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3140
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3141
	/*
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3143
	 * interface is now open
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3144
	 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3145
	if (adapter->flags & FLAG_HAS_AMT)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3146
		e1000_get_hw_control(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3147
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3148
	/*
2cefec773772 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.
2cefec773772 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
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3152
	 * clean_rx handler before we do so.
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3153
	 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3154
	e1000_configure(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3155
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3156
	err = e1000_request_irq(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3157
	if (err)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3158
		goto err_req_irq;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3159
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3160
	/*
2cefec773772 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
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3163
	 * interrupt now
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3164
	 */
2cefec773772 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) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3166
		err = e1000_test_msi(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3167
		if (err) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3168
			e_err("Interrupt allocation failed\n");
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3169
			goto err_req_irq;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3170
		}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3171
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3172
2cefec773772 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() */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3174
	clear_bit(__E1000_DOWN, &adapter->state);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3175
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3176
	napi_enable(&adapter->napi);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3177
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3178
	e1000_irq_enable(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3179
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3180
	netif_start_queue(netdev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3181
2cefec773772 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 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3183
	ew32(ICS, E1000_ICS_LSC);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3184
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3185
	return 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3186
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3187
err_req_irq:
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3188
	e1000_release_hw_control(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3189
	e1000_power_down_phy(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3190
	e1000e_free_rx_resources(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3191
err_setup_rx:
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3192
	e1000e_free_tx_resources(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3193
err_setup_tx:
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3194
	e1000e_reset(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3195
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3196
	return err;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3197
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3198
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3199
/**
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3200
 * e1000_close - Disables a network interface
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3201
 * @netdev: network interface device structure
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3202
 *
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3204
 *
2cefec773772 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
2cefec773772 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
2cefec773772 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
2cefec773772 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.
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3209
 **/
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3211
{
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3212
	struct e1000_adapter *adapter = netdev_priv(netdev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3213
2cefec773772 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));
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3215
	e1000e_down(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3216
	e1000_power_down_phy(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3217
	e1000_free_irq(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3218
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3219
	e1000e_free_tx_resources(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3220
	e1000e_free_rx_resources(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3221
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3222
	/*
2cefec773772 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
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3225
	 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3226
	if ((adapter->hw.mng_cookie.status &
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3227
			  E1000_MNG_DHCP_COOKIE_STATUS_VLAN) &&
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3228
	     !(adapter->vlgrp &&
2cefec773772 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)))
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3231
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3232
	/*
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3234
	 * interface is now closed
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3235
	 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3236
	if (adapter->flags & FLAG_HAS_AMT)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3237
		e1000_release_hw_control(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3238
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3239
	return 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3240
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3241
/**
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3243
 * @netdev: network interface device structure
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3244
 * @p: pointer to an address structure
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3245
 *
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3246
 * Returns 0 on success, negative on failure
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3247
 **/
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3249
{
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3250
	struct e1000_adapter *adapter = netdev_priv(netdev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3251
	struct sockaddr *addr = p;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3252
2cefec773772 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))
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3254
		return -EADDRNOTAVAIL;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3255
2cefec773772 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);
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3258
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3260
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3261
	if (adapter->flags & FLAG_RESET_OVERWRITES_LAA) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3262
		/* activate the work around */
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3264
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3265
		/*
2cefec773772 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
2cefec773772 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
2cefec773772 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
2cefec773772 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
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3271
		 * RAR[14]
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3272
		 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3273
		e1000e_rar_set(&adapter->hw,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3274
			      adapter->hw.mac.addr,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3275
			      adapter->hw.mac.rar_entry_count - 1);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3276
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3277
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3278
	return 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3279
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3280
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3281
/**
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3283
 * @work: pointer to our work struct
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3284
 *
2cefec773772 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
2cefec773772 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
2cefec773772 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.
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3288
 **/
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3290
{
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3291
	struct e1000_adapter *adapter = container_of(work,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3292
					struct e1000_adapter, update_phy_task);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3293
	e1000_get_phy_info(&adapter->hw);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3294
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3295
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3296
/*
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3298
 * the phy
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3299
 */
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3301
{
2cefec773772 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;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3303
	schedule_work(&adapter->update_phy_task);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3304
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3305
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3306
/**
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3308
 * @adapter: board private structure
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3309
 **/
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3311
{
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3312
	struct e1000_hw *hw = &adapter->hw;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3313
	struct pci_dev *pdev = adapter->pdev;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3314
	u16 phy_data;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3315
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3316
	/*
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3318
	 * connection is down.
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3319
	 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3320
	if (adapter->link_speed == 0)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3321
		return;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3322
	if (pci_channel_offline(pdev))
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3323
		return;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3324
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3325
	adapter->stats.crcerrs += er32(CRCERRS);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3326
	adapter->stats.gprc += er32(GPRC);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3327
	adapter->stats.gorc += er32(GORCL);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3328
	er32(GORCH); /* Clear gorc */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3329
	adapter->stats.bprc += er32(BPRC);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3330
	adapter->stats.mprc += er32(MPRC);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3331
	adapter->stats.roc += er32(ROC);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3332
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3333
	adapter->stats.mpc += er32(MPC);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3334
	if ((hw->phy.type == e1000_phy_82578) ||
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3335
	    (hw->phy.type == e1000_phy_82577)) {
2cefec773772 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);
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3338
		adapter->stats.scc += phy_data;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3339
2cefec773772 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);
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3342
		adapter->stats.ecol += phy_data;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3343
2cefec773772 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);
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3346
		adapter->stats.mcc += phy_data;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3347
2cefec773772 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);
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3350
		adapter->stats.latecol += phy_data;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3351
2cefec773772 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);
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3354
		adapter->stats.dc += phy_data;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3355
	} else {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3356
		adapter->stats.scc += er32(SCC);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3357
		adapter->stats.ecol += er32(ECOL);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3358
		adapter->stats.mcc += er32(MCC);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3359
		adapter->stats.latecol += er32(LATECOL);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3360
		adapter->stats.dc += er32(DC);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3361
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3362
	adapter->stats.xonrxc += er32(XONRXC);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3363
	adapter->stats.xontxc += er32(XONTXC);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3364
	adapter->stats.xoffrxc += er32(XOFFRXC);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3365
	adapter->stats.xofftxc += er32(XOFFTXC);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3366
	adapter->stats.gptc += er32(GPTC);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3367
	adapter->stats.gotc += er32(GOTCL);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3368
	er32(GOTCH); /* Clear gotc */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3369
	adapter->stats.rnbc += er32(RNBC);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3370
	adapter->stats.ruc += er32(RUC);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3371
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3372
	adapter->stats.mptc += er32(MPTC);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3373
	adapter->stats.bptc += er32(BPTC);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3374
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3375
	/* used for adaptive IFS */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3376
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3377
	hw->mac.tx_packet_delta = er32(TPT);
2cefec773772 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;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3379
	if ((hw->phy.type == e1000_phy_82578) ||
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3380
	    (hw->phy.type == e1000_phy_82577)) {
2cefec773772 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);
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3383
		hw->mac.collision_delta = phy_data;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3384
	} else {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3385
		hw->mac.collision_delta = er32(COLC);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3386
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3387
	adapter->stats.colc += hw->mac.collision_delta;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3388
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3389
	adapter->stats.algnerrc += er32(ALGNERRC);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3390
	adapter->stats.rxerrc += er32(RXERRC);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3391
	if ((hw->phy.type == e1000_phy_82578) ||
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3392
	    (hw->phy.type == e1000_phy_82577)) {
2cefec773772 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);
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3395
		adapter->stats.tncrs += phy_data;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3396
	} else {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3397
		if ((hw->mac.type != e1000_82574) &&
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3398
		    (hw->mac.type != e1000_82583))
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3399
			adapter->stats.tncrs += er32(TNCRS);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3400
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3401
	adapter->stats.cexterr += er32(CEXTERR);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3402
	adapter->stats.tsctc += er32(TSCTC);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3403
	adapter->stats.tsctfc += er32(TSCTFC);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3404
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3405
	/* Fill out the OS statistics structure */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3406
	adapter->net_stats.multicast = adapter->stats.mprc;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3407
	adapter->net_stats.collisions = adapter->stats.colc;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3408
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3409
	/* Rx Errors */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3410
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3411
	/*
2cefec773772 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
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3414
	 */
2cefec773772 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 +
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3416
		adapter->stats.crcerrs + adapter->stats.algnerrc +
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3417
		adapter->stats.ruc + adapter->stats.roc +
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3418
		adapter->stats.cexterr;
2cefec773772 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 +
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3420
					      adapter->stats.roc;
2cefec773772 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;
2cefec773772 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;
2cefec773772 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;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3424
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3425
	/* Tx Errors */
2cefec773772 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 +
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3427
				       adapter->stats.latecol;
2cefec773772 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;
2cefec773772 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;
2cefec773772 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;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3431
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3432
	/* Tx Dropped needs to be maintained elsewhere */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3433
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3434
	/* Management Stats */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3435
	adapter->stats.mgptc += er32(MGTPTC);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3436
	adapter->stats.mgprc += er32(MGTPRC);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3437
	adapter->stats.mgpdc += er32(MGTPDC);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3438
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3439
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3440
/**
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3442
 * @adapter: board private structure
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3443
 **/
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3445
{
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3446
	struct e1000_hw *hw = &adapter->hw;
2cefec773772 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;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3448
	int ret_val;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3449
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3450
	if ((er32(STATUS) & E1000_STATUS_LU) &&
2cefec773772 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)) {
2cefec773772 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);
2cefec773772 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);
2cefec773772 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);
2cefec773772 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);
2cefec773772 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);
2cefec773772 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);
2cefec773772 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);
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3460
		if (ret_val)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3461
			e_warn("Error reading PHY register\n");
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3462
	} else {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3463
		/*
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3465
		 * Set values to typical power-on defaults
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3466
		 */
2cefec773772 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);
2cefec773772 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 |
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3469
			     BMSR_10HALF | BMSR_ESTATEN | BMSR_ANEGCAPABLE |
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3470
			     BMSR_ERCAP);
2cefec773772 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 |
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3472
				  ADVERTISE_ALL | ADVERTISE_CSMA);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3473
		phy->lpa = 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3474
		phy->expansion = EXPANSION_ENABLENPAGE;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3475
		phy->ctrl1000 = ADVERTISE_1000FULL;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3476
		phy->stat1000 = 0;
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3478
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3479
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3480
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3482
{
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3483
	struct e1000_hw *hw = &adapter->hw;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3484
	u32 ctrl = er32(CTRL);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3485
2cefec773772 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 */
2cefec773772 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, "
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3488
	       "Flow Control: %s\n",
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3489
	       adapter->netdev->name,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3490
	       adapter->link_speed,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3491
	       (adapter->link_duplex == FULL_DUPLEX) ?
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3492
	                        "Full Duplex" : "Half Duplex",
2cefec773772 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)) ?
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3494
	                        "RX/TX" :
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3495
	       ((ctrl & E1000_CTRL_RFCE) ? "RX" :
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3496
	       ((ctrl & E1000_CTRL_TFCE) ? "TX" : "None" )));
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3497
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3498
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3500
{
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3501
	struct e1000_hw *hw = &adapter->hw;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3502
	bool link_active = 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3503
	s32 ret_val = 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3504
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3505
	/*
2cefec773772 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
2cefec773772 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
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3509
	 * for copper adapters ONLY
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3510
	 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3511
	switch (hw->phy.media_type) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3512
	case e1000_media_type_copper:
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3513
		if (hw->mac.get_link_status) {
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3515
			link_active = !hw->mac.get_link_status;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3516
		} else {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3517
			link_active = 1;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3518
		}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3519
		break;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3520
	case e1000_media_type_fiber:
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3522
		link_active = !!(er32(STATUS) & E1000_STATUS_LU);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3523
		break;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3524
	case e1000_media_type_internal_serdes:
2cefec773772 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);
2cefec773772 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;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3527
		break;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3528
	default:
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3529
	case e1000_media_type_unknown:
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3530
		break;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3531
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3532
2cefec773772 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) &&
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3534
	    (er32(CTRL) & E1000_PHY_CTRL_GBE_DISABLE)) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3535
		/* See e1000_kmrn_lock_loss_workaround_ich8lan() */
2cefec773772 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");
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3537
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3538
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3539
	return link_active;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3540
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3541
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3543
{
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3544
	/* make sure the receive unit is started */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3545
	if ((adapter->flags & FLAG_RX_NEEDS_RESTART) &&
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3546
	    (adapter->flags & FLAG_RX_RESTART_NOW)) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3547
		struct e1000_hw *hw = &adapter->hw;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3548
		u32 rctl = er32(RCTL);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3549
		ew32(RCTL, rctl | E1000_RCTL_EN);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3550
		adapter->flags &= ~FLAG_RX_RESTART_NOW;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3551
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3552
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3553
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3554
/**
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3555
 * e1000_watchdog - Timer Call-back
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3557
 **/
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3558
static void e1000_watchdog(unsigned long data)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3559
{
2cefec773772 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;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3561
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3562
	/* Do the rest outside of interrupt context */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3563
	schedule_work(&adapter->watchdog_task);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3564
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3565
	/* TODO: make this use queue_delayed_work() */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3566
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3567
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3569
{
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3570
	struct e1000_adapter *adapter = container_of(work,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3571
					struct e1000_adapter, watchdog_task);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3572
	struct net_device *netdev = adapter->netdev;
2cefec773772 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;
2cefec773772 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;
2cefec773772 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;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3576
	struct e1000_hw *hw = &adapter->hw;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3577
	u32 link, tctl;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3578
	int tx_pending = 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3579
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3580
	link = e1000_has_link(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3581
	if ((netif_carrier_ok(netdev)) && link) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3582
		e1000e_enable_receives(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3583
		goto link_up;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3584
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3585
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3586
	if ((e1000e_enable_tx_pkt_filtering(hw)) &&
2cefec773772 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))
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3588
		e1000_update_mng_vlan(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3589
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3590
	if (link) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3591
		if (!netif_carrier_ok(netdev)) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3592
			bool txb2b = 1;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3593
			/* update snapshot of PHY registers on LSC */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3594
			e1000_phy_read_status(adapter);
2cefec773772 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,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3596
						   &adapter->link_speed,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3597
						   &adapter->link_duplex);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3598
			e1000_print_link_info(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3599
			/*
2cefec773772 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
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3602
			 */
2cefec773772 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 ||
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3604
			     hw->phy.type == e1000_phy_bm) &&
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3605
			    (hw->mac.autoneg == true) &&
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3606
			    (adapter->link_speed == SPEED_10 ||
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3607
			     adapter->link_speed == SPEED_100) &&
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3608
			    (adapter->link_duplex == HALF_DUPLEX)) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3609
				u16 autoneg_exp;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3610
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3612
2cefec773772 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))
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3614
					e_info("Autonegotiated half duplex but"
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3615
					       " link partner cannot autoneg. "
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3616
					       " Try forcing full duplex if "
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3617
					       "link gets many collisions.\n");
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3618
			}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3619
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3620
			/*
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3622
			 * and adjust the timeout factor
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3623
			 */
2cefec773772 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;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3625
			adapter->tx_timeout_factor = 1;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3626
			switch (adapter->link_speed) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3627
			case SPEED_10:
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3628
				txb2b = 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3629
				netdev->tx_queue_len = 10;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3630
				adapter->tx_timeout_factor = 16;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3631
				break;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3632
			case SPEED_100:
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3633
				txb2b = 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3634
				netdev->tx_queue_len = 100;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3635
				adapter->tx_timeout_factor = 10;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3636
				break;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3637
			}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3638
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3639
			/*
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3640
			 * workaround: re-program speed mode bit after
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3641
			 * link-up event
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3642
			 */
2cefec773772 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) &&
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3644
			    !txb2b) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3645
				u32 tarc0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3646
				tarc0 = er32(TARC(0));
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3647
				tarc0 &= ~SPEED_MODE_BIT;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3648
				ew32(TARC(0), tarc0);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3649
			}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3650
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3651
			/*
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3653
			 * some hardware issues
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3654
			 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3655
			if (!(adapter->flags & FLAG_TSO_FORCE)) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3656
				switch (adapter->link_speed) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3657
				case SPEED_10:
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3658
				case SPEED_100:
2cefec773772 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");
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3660
					netdev->features &= ~NETIF_F_TSO;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3661
					netdev->features &= ~NETIF_F_TSO6;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3662
					break;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3663
				case SPEED_1000:
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3664
					netdev->features |= NETIF_F_TSO;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3665
					netdev->features |= NETIF_F_TSO6;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3666
					break;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3667
				default:
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3668
					/* oops */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3669
					break;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3670
				}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3671
			}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3672
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3673
			/*
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3675
			 * after setting TARC(0)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3676
			 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3677
			tctl = er32(TCTL);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3678
			tctl |= E1000_TCTL_EN;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3679
			ew32(TCTL, tctl);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3680
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3681
                        /*
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3682
			 * Perform any post-link-up configuration before
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3683
			 * reporting link up.
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3684
			 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3685
			if (phy->ops.cfg_on_link_up)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3686
				phy->ops.cfg_on_link_up(hw);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3687
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3688
			netif_carrier_on(netdev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3689
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3690
			if (!test_bit(__E1000_DOWN, &adapter->state))
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3691
				mod_timer(&adapter->phy_info_timer,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3692
					  round_jiffies(jiffies + 2 * HZ));
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3693
		}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3694
	} else {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3695
		if (netif_carrier_ok(netdev)) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3696
			adapter->link_speed = 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3697
			adapter->link_duplex = 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3698
			/* Link status message must follow this format */
2cefec773772 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",
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3700
			       adapter->netdev->name);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3701
			netif_carrier_off(netdev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3702
			if (!test_bit(__E1000_DOWN, &adapter->state))
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3703
				mod_timer(&adapter->phy_info_timer,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3704
					  round_jiffies(jiffies + 2 * HZ));
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3705
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3706
			if (adapter->flags & FLAG_RX_NEEDS_RESTART)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3707
				schedule_work(&adapter->reset_task);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3708
		}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3709
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3710
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3711
link_up:
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3712
	e1000e_update_stats(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3713
2cefec773772 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;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3715
	adapter->tpt_old = adapter->stats.tpt;
2cefec773772 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;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3717
	adapter->colc_old = adapter->stats.colc;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3718
2cefec773772 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;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3720
	adapter->gorc_old = adapter->stats.gorc;
2cefec773772 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;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3722
	adapter->gotc_old = adapter->stats.gotc;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3723
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3724
	e1000e_update_adaptive(&adapter->hw);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3725
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3726
	if (!netif_carrier_ok(netdev)) {
2cefec773772 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 <
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3728
			       tx_ring->count);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3729
		if (tx_pending) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3730
			/*
2cefec773772 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,
2cefec773772 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
2cefec773772 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.
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3734
			 * (Do the reset outside of interrupt context).
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3735
			 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3736
			adapter->tx_timeout_count++;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3737
			schedule_work(&adapter->reset_task);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3738
			/* return immediately since reset is imminent */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3739
			return;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3740
		}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3741
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3742
2cefec773772 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 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3744
	if (adapter->msix_entries)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3745
		ew32(ICS, adapter->rx_ring->ims_val);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3746
	else
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3747
		ew32(ICS, E1000_ICS_RXDMT0);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3748
2cefec773772 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 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3750
	adapter->detect_tx_hung = 1;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3751
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3752
	/*
2cefec773772 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
2cefec773772 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]
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3755
	 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3756
	if (e1000e_get_laa_state_82571(hw))
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3758
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3759
	/* Reset the timer */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3760
	if (!test_bit(__E1000_DOWN, &adapter->state))
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3761
		mod_timer(&adapter->watchdog_timer,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3762
			  round_jiffies(jiffies + 2 * HZ));
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3763
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3764
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3765
#define E1000_TX_FLAGS_CSUM		0x00000001
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3766
#define E1000_TX_FLAGS_VLAN		0x00000002
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3767
#define E1000_TX_FLAGS_TSO		0x00000004
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3768
#define E1000_TX_FLAGS_IPV4		0x00000008
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3769
#define E1000_TX_FLAGS_VLAN_MASK	0xffff0000
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3770
#define E1000_TX_FLAGS_VLAN_SHIFT	16
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3771
2cefec773772 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,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3773
		     struct sk_buff *skb)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3774
{
2cefec773772 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;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3776
	struct e1000_context_desc *context_desc;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3777
	struct e1000_buffer *buffer_info;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3778
	unsigned int i;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3779
	u32 cmd_length = 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3780
	u16 ipcse = 0, tucse, mss;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3781
	u8 ipcss, ipcso, tucss, tucso, hdr_len;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3782
	int err;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3783
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3784
	if (skb_is_gso(skb)) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3785
		if (skb_header_cloned(skb)) {
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3787
			if (err)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3788
				return err;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3789
		}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3790
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3792
		mss = skb_shinfo(skb)->gso_size;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3793
		if (skb->protocol == htons(ETH_P_IP)) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3794
			struct iphdr *iph = ip_hdr(skb);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3795
			iph->tot_len = 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3796
			iph->check = 0;
2cefec773772 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,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3798
								 iph->daddr, 0,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3799
								 IPPROTO_TCP,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3800
								 0);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3801
			cmd_length = E1000_TXD_CMD_IP;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3802
			ipcse = skb_transport_offset(skb) - 1;
2cefec773772 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) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3804
			ipv6_hdr(skb)->payload_len = 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3805
			tcp_hdr(skb)->check =
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3806
				~csum_ipv6_magic(&ipv6_hdr(skb)->saddr,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3807
						 &ipv6_hdr(skb)->daddr,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3808
						 0, IPPROTO_TCP, 0);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3809
			ipcse = 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3810
		}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3811
		ipcss = skb_network_offset(skb);
2cefec773772 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;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3813
		tucss = skb_transport_offset(skb);
2cefec773772 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;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3815
		tucse = 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3816
2cefec773772 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 |
2cefec773772 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)));
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3819
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3820
		i = tx_ring->next_to_use;
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3822
		buffer_info = &tx_ring->buffer_info[i];
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3823
2cefec773772 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;
2cefec773772 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;
2cefec773772 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);
2cefec773772 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;
2cefec773772 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;
2cefec773772 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);
2cefec773772 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);
2cefec773772 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;
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3833
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3834
		buffer_info->time_stamp = jiffies;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3835
		buffer_info->next_to_watch = i;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3836
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3837
		i++;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3838
		if (i == tx_ring->count)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3839
			i = 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3840
		tx_ring->next_to_use = i;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3841
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3842
		return 1;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3843
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3844
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3845
	return 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3846
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3847
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3849
{
2cefec773772 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;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3851
	struct e1000_context_desc *context_desc;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3852
	struct e1000_buffer *buffer_info;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3853
	unsigned int i;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3854
	u8 css;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3855
	u32 cmd_len = E1000_TXD_CMD_DEXT;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3856
	__be16 protocol;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3857
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3858
	if (skb->ip_summed != CHECKSUM_PARTIAL)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3859
		return 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3860
2cefec773772 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))
2cefec773772 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;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3863
	else
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3864
		protocol = skb->protocol;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3865
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3866
	switch (protocol) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3867
	case cpu_to_be16(ETH_P_IP):
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3868
		if (ip_hdr(skb)->protocol == IPPROTO_TCP)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3869
			cmd_len |= E1000_TXD_CMD_TCP;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3870
		break;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3871
	case cpu_to_be16(ETH_P_IPV6):
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3872
		/* XXX not handling all IPV6 headers */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3873
		if (ipv6_hdr(skb)->nexthdr == IPPROTO_TCP)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3874
			cmd_len |= E1000_TXD_CMD_TCP;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3875
		break;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3876
	default:
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3877
		if (unlikely(net_ratelimit()))
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3878
			e_warn("checksum_partial proto=%x!\n",
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3879
			       be16_to_cpu(protocol));
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3880
		break;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3881
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3882
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3883
	css = skb_transport_offset(skb);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3884
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3885
	i = tx_ring->next_to_use;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3886
	buffer_info = &tx_ring->buffer_info[i];
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3888
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3889
	context_desc->lower_setup.ip_config = 0;
2cefec773772 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;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3891
	context_desc->upper_setup.tcp_fields.tucso =
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3892
				css + skb->csum_offset;
2cefec773772 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;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3894
	context_desc->tcp_seg_setup.data = 0;
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3896
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3897
	buffer_info->time_stamp = jiffies;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3898
	buffer_info->next_to_watch = i;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3899
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3900
	i++;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3901
	if (i == tx_ring->count)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3902
		i = 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3903
	tx_ring->next_to_use = i;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3904
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3905
	return 1;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3906
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3907
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3908
#define E1000_MAX_PER_TXD	8192
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3909
#define E1000_MAX_TXD_PWR	12
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3910
2cefec773772 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,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3912
			struct sk_buff *skb, unsigned int first,
2cefec773772 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,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3914
			unsigned int mss)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3915
{
2cefec773772 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;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3917
	struct e1000_buffer *buffer_info;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3918
	unsigned int len = skb_headlen(skb);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3919
	unsigned int offset, size, count = 0, i;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3920
	unsigned int f;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3921
	dma_addr_t *map;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3922
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3923
	i = tx_ring->next_to_use;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3924
2cefec773772 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)) {
2cefec773772 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");
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3927
		adapter->tx_dma_failed++;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3928
		return 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3929
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3930
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3931
	map = skb_shinfo(skb)->dma_maps;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3932
	offset = 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3933
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3934
	while (len) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3935
		buffer_info = &tx_ring->buffer_info[i];
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3936
		size = min(len, max_per_txd);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3937
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3938
		buffer_info->length = size;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3939
		buffer_info->time_stamp = jiffies;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3940
		buffer_info->next_to_watch = i;
2cefec773772 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;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3942
		count++;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3943
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3944
		len -= size;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3945
		offset += size;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3946
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3947
		if (len) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3948
			i++;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3949
			if (i == tx_ring->count)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3950
				i = 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3951
		}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3952
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3953
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3954
	for (f = 0; f < nr_frags; f++) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3955
		struct skb_frag_struct *frag;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3956
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3957
		frag = &skb_shinfo(skb)->frags[f];
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3958
		len = frag->size;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3959
		offset = 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3960
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3961
		while (len) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3962
			i++;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3963
			if (i == tx_ring->count)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3964
				i = 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3965
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3966
			buffer_info = &tx_ring->buffer_info[i];
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3967
			size = min(len, max_per_txd);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3968
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3969
			buffer_info->length = size;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3970
			buffer_info->time_stamp = jiffies;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3971
			buffer_info->next_to_watch = i;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3972
			buffer_info->dma = map[f] + offset;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3973
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3974
			len -= size;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3975
			offset += size;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3976
			count++;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3977
		}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3978
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3979
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3980
	tx_ring->buffer_info[i].skb = skb;
2cefec773772 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;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3982
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3983
	return count;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3984
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3985
2cefec773772 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,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3987
			   int tx_flags, int count)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3988
{
2cefec773772 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;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3990
	struct e1000_tx_desc *tx_desc = NULL;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3991
	struct e1000_buffer *buffer_info;
2cefec773772 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;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3993
	unsigned int i;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3994
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3995
	if (tx_flags & E1000_TX_FLAGS_TSO) {
2cefec773772 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 |
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3997
			     E1000_TXD_CMD_TSE;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3998
		txd_upper |= E1000_TXD_POPTS_TXSM << 8;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3999
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4000
		if (tx_flags & E1000_TX_FLAGS_IPV4)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4001
			txd_upper |= E1000_TXD_POPTS_IXSM << 8;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4002
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4003
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4004
	if (tx_flags & E1000_TX_FLAGS_CSUM) {
2cefec773772 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;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4006
		txd_upper |= E1000_TXD_POPTS_TXSM << 8;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4007
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4008
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4009
	if (tx_flags & E1000_TX_FLAGS_VLAN) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4010
		txd_lower |= E1000_TXD_CMD_VLE;
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4012
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4013
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4014
	i = tx_ring->next_to_use;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4015
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4016
	while (count--) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4017
		buffer_info = &tx_ring->buffer_info[i];
2cefec773772 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);
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4020
		tx_desc->lower.data =
2cefec773772 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);
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4023
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4024
		i++;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4025
		if (i == tx_ring->count)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4026
			i = 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4027
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4028
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4030
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4031
	/*
2cefec773772 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
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4034
	 * applicable for weak-ordered memory model archs,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4035
	 * such as IA-64).
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4036
	 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4037
	wmb();
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4038
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4039
	tx_ring->next_to_use = i;
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4041
	/*
2cefec773772 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
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4044
	 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4045
	mmiowb();
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4046
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4047
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4048
#define MINIMUM_DHCP_PACKET_SIZE 282
2cefec773772 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,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4050
				    struct sk_buff *skb)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4051
{
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4052
	struct e1000_hw *hw =  &adapter->hw;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4053
	u16 length, offset;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4054
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4055
	if (vlan_tx_tag_present(skb)) {
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4057
		    && (adapter->hw.mng_cookie.status &
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4058
			E1000_MNG_DHCP_COOKIE_STATUS_VLAN)))
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4059
			return 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4060
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4061
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4062
	if (skb->len <= MINIMUM_DHCP_PACKET_SIZE)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4063
		return 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4064
2cefec773772 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))
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4066
		return 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4067
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4068
	{
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4070
		struct udphdr *udp;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4071
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4072
		if (ip->protocol != IPPROTO_UDP)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4073
			return 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4074
2cefec773772 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));
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4076
		if (ntohs(udp->dest) != 67)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4077
			return 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4078
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4079
		offset = (u8 *)udp + 8 - skb->data;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4080
		length = skb->len - offset;
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4082
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4083
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4084
	return 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4085
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4086
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4088
{
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4089
	struct e1000_adapter *adapter = netdev_priv(netdev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4090
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4091
	netif_stop_queue(netdev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4092
	/*
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4093
	 * Herbert's original patch had:
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4094
	 *  smp_mb__after_netif_stop_queue();
2cefec773772 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.
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4096
	 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4097
	smp_mb();
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4098
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4099
	/*
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4101
	 * made room available.
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4102
	 */
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4104
		return -EBUSY;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4105
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4106
	/* A reprieve! */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4107
	netif_start_queue(netdev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4108
	++adapter->restart_queue;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4109
	return 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4110
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4111
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4113
{
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4114
	struct e1000_adapter *adapter = netdev_priv(netdev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4115
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4117
		return 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4118
	return __e1000_maybe_stop_tx(netdev, size);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4119
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4120
2cefec773772 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 )
2cefec773772 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,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4123
				    struct net_device *netdev)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4124
{
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4125
	struct e1000_adapter *adapter = netdev_priv(netdev);
2cefec773772 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;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4127
	unsigned int first;
2cefec773772 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;
2cefec773772 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;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4130
	unsigned int tx_flags = 0;
2cefec773772 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;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4132
	unsigned int nr_frags;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4133
	unsigned int mss;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4134
	int count = 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4135
	int tso;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4136
	unsigned int f;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4137
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4138
	if (test_bit(__E1000_DOWN, &adapter->state)) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4139
		dev_kfree_skb_any(skb);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4140
		return NETDEV_TX_OK;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4141
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4142
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4143
	if (skb->len <= 0) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4144
		dev_kfree_skb_any(skb);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4145
		return NETDEV_TX_OK;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4146
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4147
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4148
	mss = skb_shinfo(skb)->gso_size;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4149
	/*
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4150
	 * The controller does a simple calculation to
2cefec773772 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
2cefec773772 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:
2cefec773772 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
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4155
	 * drops.
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4156
	 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4157
	if (mss) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4158
		u8 hdr_len;
2cefec773772 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);
2cefec773772 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;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4161
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4162
		/*
2cefec773772 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
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4165
		 * frags into skb->data
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4166
		 */
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4168
		/*
2cefec773772 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,
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4171
		 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4172
		if (skb->data_len && (hdr_len == len)) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4173
			unsigned int pull_size;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4174
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4176
			if (!__pskb_pull_tail(skb, pull_size)) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4177
				e_err("__pskb_pull_tail failed.\n");
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4178
				dev_kfree_skb_any(skb);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4179
				return NETDEV_TX_OK;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4180
			}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4181
			len = skb->len - skb->data_len;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4182
		}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4183
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4184
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4185
	/* reserve a descriptor for the offload context */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4186
	if ((mss) || (skb->ip_summed == CHECKSUM_PARTIAL))
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4187
		count++;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4188
	count++;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4189
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4191
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4192
	nr_frags = skb_shinfo(skb)->nr_frags;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4193
	for (f = 0; f < nr_frags; f++)
2cefec773772 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,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4195
				       max_txd_pwr);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4196
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4197
	if (adapter->hw.mac.tx_pkt_filtering)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4198
		e1000_transfer_dhcp_info(adapter, skb);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4199
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4200
	/*
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4202
	 * head, otherwise try next time
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4203
	 */
2cefec773772 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))
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4205
		return NETDEV_TX_BUSY;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4206
2cefec773772 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)) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4208
		tx_flags |= E1000_TX_FLAGS_VLAN;
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4210
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4211
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4212
	first = tx_ring->next_to_use;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4213
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4214
	tso = e1000_tso(adapter, skb);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4215
	if (tso < 0) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4216
		dev_kfree_skb_any(skb);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4217
		return NETDEV_TX_OK;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4218
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4219
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4220
	if (tso)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4221
		tx_flags |= E1000_TX_FLAGS_TSO;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4222
	else if (e1000_tx_csum(adapter, skb))
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4223
		tx_flags |= E1000_TX_FLAGS_CSUM;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4224
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4225
	/*
2cefec773772 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.
2cefec773772 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...
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4228
	 * no longer assume, we must.
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4229
	 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4230
	if (skb->protocol == htons(ETH_P_IP))
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4231
		tx_flags |= E1000_TX_FLAGS_IPV4;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4232
2cefec773772 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 */
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4235
	if (count) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4236
		e1000_tx_queue(adapter, tx_flags, count);
2cefec773772 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. */
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4239
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4240
	} else {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4241
		dev_kfree_skb_any(skb);
2cefec773772 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;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4243
		tx_ring->next_to_use = first;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4244
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4245
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4246
	return NETDEV_TX_OK;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4247
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4248
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4249
/**
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4251
 * @netdev: network interface device structure
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4252
 **/
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4254
{
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4255
	struct e1000_adapter *adapter = netdev_priv(netdev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4256
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4257
	/* Do the reset outside of interrupt context */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4258
	adapter->tx_timeout_count++;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4259
	schedule_work(&adapter->reset_task);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4260
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4261
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4263
{
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4264
	struct e1000_adapter *adapter;
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4266
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4267
	e1000e_reinit_locked(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4268
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4269
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4270
/**
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4271
 * e1000_get_stats - Get System Network Statistics
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4272
 * @netdev: network interface device structure
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4273
 *
2cefec773772 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.
2cefec773772 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.
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4276
 **/
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4278
{
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4279
	struct e1000_adapter *adapter = netdev_priv(netdev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4280
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4281
	/* only return the current stats */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4282
	return &adapter->net_stats;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4283
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4284
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4285
/**
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4287
 * @netdev: network interface device structure
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4289
 *
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4290
 * Returns 0 on success, negative on failure
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4291
 **/
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4293
{
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4294
	struct e1000_adapter *adapter = netdev_priv(netdev);
2cefec773772 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;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4296
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4297
	/* Jumbo frame support */
2cefec773772 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) &&
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4299
	    !(adapter->flags & FLAG_HAS_JUMBO_FRAMES)) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4300
		e_err("Jumbo Frames not supported.\n");
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4301
		return -EINVAL;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4302
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4303
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4304
	/* Supported frame sizes */
2cefec773772 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) ||
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4306
	    (max_frame > adapter->max_hw_frame_size)) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4307
		e_err("Unsupported MTU setting\n");
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4308
		return -EINVAL;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4309
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4310
2cefec773772 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))
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4312
		msleep(1);
2cefec773772 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 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4314
	adapter->max_frame_size = max_frame;
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4316
	netdev->mtu = new_mtu;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4317
	if (netif_running(netdev))
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4318
		e1000e_down(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4319
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4320
	/*
2cefec773772 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
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4323
	 * larger slab size.
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4324
	 * i.e. RXBUFFER_2048 --> size-4096 slab
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4326
	 * fragmented skbs
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4327
	 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4328
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4329
	if (max_frame <= 2048)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4330
		adapter->rx_buffer_len = 2048;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4331
	else
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4332
		adapter->rx_buffer_len = 4096;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4333
2cefec773772 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 */
2cefec773772 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) ||
2cefec773772 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))
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4338
					 + ETH_FCS_LEN;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4339
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4340
	if (netif_running(netdev))
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4341
		e1000e_up(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4342
	else
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4343
		e1000e_reset(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4344
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4345
	clear_bit(__E1000_RESETTING, &adapter->state);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4346
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4347
	return 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4348
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4349
2cefec773772 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,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4351
			   int cmd)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4352
{
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4353
	struct e1000_adapter *adapter = netdev_priv(netdev);
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4355
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4357
		return -EOPNOTSUPP;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4358
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4359
	switch (cmd) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4360
	case SIOCGMIIPHY:
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4361
		data->phy_id = adapter->hw.phy.addr;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4362
		break;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4363
	case SIOCGMIIREG:
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4364
		switch (data->reg_num & 0x1F) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4365
		case MII_BMCR:
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4366
			data->val_out = adapter->phy_regs.bmcr;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4367
			break;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4368
		case MII_BMSR:
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4369
			data->val_out = adapter->phy_regs.bmsr;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4370
			break;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4371
		case MII_PHYSID1:
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4373
			break;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4374
		case MII_PHYSID2:
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4376
			break;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4377
		case MII_ADVERTISE:
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4378
			data->val_out = adapter->phy_regs.advertise;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4379
			break;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4380
		case MII_LPA:
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4381
			data->val_out = adapter->phy_regs.lpa;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4382
			break;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4383
		case MII_EXPANSION:
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4384
			data->val_out = adapter->phy_regs.expansion;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4385
			break;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4386
		case MII_CTRL1000:
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4387
			data->val_out = adapter->phy_regs.ctrl1000;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4388
			break;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4389
		case MII_STAT1000:
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4390
			data->val_out = adapter->phy_regs.stat1000;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4391
			break;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4392
		case MII_ESTATUS:
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4393
			data->val_out = adapter->phy_regs.estatus;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4394
			break;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4395
		default:
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4396
			return -EIO;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4397
		}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4398
		break;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4399
	case SIOCSMIIREG:
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4400
	default:
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4401
		return -EOPNOTSUPP;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4402
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4403
	return 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4404
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4405
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4407
{
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4408
	switch (cmd) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4409
	case SIOCGMIIPHY:
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4410
	case SIOCGMIIREG:
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4411
	case SIOCSMIIREG:
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4412
		return e1000_mii_ioctl(netdev, ifr, cmd);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4413
	default:
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4414
		return -EOPNOTSUPP;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4415
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4416
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4417
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4419
{
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4420
	struct e1000_hw *hw = &adapter->hw;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4421
	u32 i, mac_reg;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4422
	u16 phy_reg;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4423
	int retval = 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4424
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4425
	/* copy MAC RARs to PHY RARs */
2cefec773772 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++) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4427
		mac_reg = er32(RAL(i));
2cefec773772 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));
2cefec773772 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));
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4430
		mac_reg = er32(RAH(i));
2cefec773772 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));
2cefec773772 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));
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4433
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4434
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4435
	/* copy MAC MTA to PHY MTA */
2cefec773772 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++) {
2cefec773772 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);
2cefec773772 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));
2cefec773772 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));
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4440
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4441
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4442
	/* configure PHY Rx Control register */
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4444
	mac_reg = er32(RCTL);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4445
	if (mac_reg & E1000_RCTL_UPE)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4446
		phy_reg |= BM_RCTL_UPE;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4447
	if (mac_reg & E1000_RCTL_MPE)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4448
		phy_reg |= BM_RCTL_MPE;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4449
	phy_reg &= ~(BM_RCTL_MO_MASK);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4450
	if (mac_reg & E1000_RCTL_MO_3)
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4452
				<< BM_RCTL_MO_SHIFT);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4453
	if (mac_reg & E1000_RCTL_BAM)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4454
		phy_reg |= BM_RCTL_BAM;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4455
	if (mac_reg & E1000_RCTL_PMCF)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4456
		phy_reg |= BM_RCTL_PMCF;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4457
	mac_reg = er32(CTRL);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4458
	if (mac_reg & E1000_CTRL_RFCE)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4459
		phy_reg |= BM_RCTL_RFCE;
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4461
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4462
	/* enable PHY wakeup in MAC register */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4463
	ew32(WUFC, wufc);
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4465
2cefec773772 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 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4467
	e1e_wphy(&adapter->hw, BM_WUFC, wufc);
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4469
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4470
	/* activate PHY wakeup */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4471
	retval = hw->phy.ops.acquire_phy(hw);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4472
	if (retval) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4473
		e_err("Could not acquire PHY\n");
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4474
		return retval;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4475
	}
2cefec773772 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,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4477
	                         (BM_WUC_ENABLE_PAGE << IGP_PAGE_SHIFT));
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4479
	if (retval) {
2cefec773772 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");
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4481
		goto out;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4482
	}
2cefec773772 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;
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4485
	if (retval)
2cefec773772 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");
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4487
out:
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4488
	hw->phy.ops.release_phy(hw);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4489
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4490
	return retval;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4491
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4492
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4494
{
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4496
	struct e1000_adapter *adapter = netdev_priv(netdev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4497
	struct e1000_hw *hw = &adapter->hw;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4498
	u32 ctrl, ctrl_ext, rctl, status;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4499
	u32 wufc = adapter->wol;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4500
	int retval = 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4501
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4502
	netif_device_detach(netdev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4503
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4504
	if (netif_running(netdev)) {
2cefec773772 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));
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4506
		e1000e_down(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4507
		e1000_free_irq(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4508
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4509
	e1000e_reset_interrupt_capability(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4510
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4511
	retval = pci_save_state(pdev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4512
	if (retval)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4513
		return retval;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4514
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4515
	status = er32(STATUS);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4516
	if (status & E1000_STATUS_LU)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4517
		wufc &= ~E1000_WUFC_LNKC;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4518
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4519
	if (wufc) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4520
		e1000_setup_rctl(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4521
		e1000_set_multi(netdev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4522
2cefec773772 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 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4524
		if (wufc & E1000_WUFC_MC) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4525
			rctl = er32(RCTL);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4526
			rctl |= E1000_RCTL_MPE;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4527
			ew32(RCTL, rctl);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4528
		}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4529
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4530
		ctrl = er32(CTRL);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4531
		/* advertise wake from D3Cold */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4532
		#define E1000_CTRL_ADVD3WUC 0x00100000
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4533
		/* phy power management enable */
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4535
		ctrl |= E1000_CTRL_ADVD3WUC;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4536
		if (!(adapter->flags2 & FLAG2_HAS_PHY_WAKEUP))
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4537
			ctrl |= E1000_CTRL_EN_PHY_PWR_MGMT;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4538
		ew32(CTRL, ctrl);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4539
2cefec773772 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 ||
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4541
		    adapter->hw.phy.media_type ==
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4542
		    e1000_media_type_internal_serdes) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4543
			/* keep the laser running in D3 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4544
			ctrl_ext = er32(CTRL_EXT);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4545
			ctrl_ext |= E1000_CTRL_EXT_SDP7_DATA;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4546
			ew32(CTRL_EXT, ctrl_ext);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4547
		}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4548
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4549
		if (adapter->flags & FLAG_IS_ICH)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4550
			e1000e_disable_gig_wol_ich8lan(&adapter->hw);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4551
2cefec773772 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 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4553
		e1000e_disable_pcie_master(&adapter->hw);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4554
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4555
		if (adapter->flags2 & FLAG2_HAS_PHY_WAKEUP) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4556
			/* enable wakeup by the PHY */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4557
			retval = e1000_init_phy_wakeup(adapter, wufc);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4558
			if (retval)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4559
				return retval;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4560
		} else {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4561
			/* enable wakeup by the MAC */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4562
			ew32(WUFC, wufc);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4563
			ew32(WUC, E1000_WUC_PME_EN);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4564
		}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4565
	} else {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4566
		ew32(WUC, 0);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4567
		ew32(WUFC, 0);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4568
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4569
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4570
	*enable_wake = !!wufc;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4571
2cefec773772 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 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4573
	if ((adapter->flags & FLAG_MNG_PT_ENABLED) ||
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4574
	    (hw->mac.ops.check_mng_mode(hw)))
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4575
		*enable_wake = true;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4576
2cefec773772 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)
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4579
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4580
	/*
2cefec773772 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
2cefec773772 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.
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4583
	 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4584
	e1000_release_hw_control(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4585
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4586
	pci_disable_device(pdev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4587
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4588
	return 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4589
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4590
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4592
{
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4593
	if (sleep && wake) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4594
		pci_prepare_to_sleep(pdev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4595
		return;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4596
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4597
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4598
	pci_wake_from_d3(pdev, wake);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4599
	pci_set_power_state(pdev, PCI_D3hot);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4600
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4601
2cefec773772 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,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4603
                                    bool wake)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4604
{
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4606
	struct e1000_adapter *adapter = netdev_priv(netdev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4607
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4608
	/*
2cefec773772 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
2cefec773772 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
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4612
	 * downstream port of the pci-e switch.
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4613
	 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4614
	if (adapter->flags & FLAG_IS_QUAD_PORT) {
2cefec773772 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;
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4617
		u16 devctl;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4618
2cefec773772 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);
2cefec773772 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,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4621
		                      (devctl & ~PCI_EXP_DEVCTL_CERE));
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4622
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4623
		e1000_power_off(pdev, sleep, wake);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4624
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4626
	} else {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4627
		e1000_power_off(pdev, sleep, wake);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4628
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4629
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4630
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4632
{
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4633
	int pos;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4634
	u16 val;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4635
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4636
	/*
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4638
	 *
2cefec773772 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
2cefec773772 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
2cefec773772 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,
2cefec773772 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.
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4643
	 *
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4645
	 * active.
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4646
	 */
2cefec773772 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);
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4649
	if (val & 0x2) {
2cefec773772 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");
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4651
		val &= ~0x2;
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4653
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4654
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4655
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4656
#ifdef CONFIG_PM
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4658
{
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4659
	int retval;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4660
	bool wake;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4661
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4662
	retval = __e1000_shutdown(pdev, &wake);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4663
	if (!retval)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4664
		e1000_complete_shutdown(pdev, true, wake);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4665
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4666
	return retval;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4667
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4668
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4670
{
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4672
	struct e1000_adapter *adapter = netdev_priv(netdev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4673
	struct e1000_hw *hw = &adapter->hw;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4674
	u32 err;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4675
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4676
	pci_set_power_state(pdev, PCI_D0);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4677
	pci_restore_state(pdev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4678
	e1000e_disable_l1aspm(pdev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4679
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4680
	err = pci_enable_device_mem(pdev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4681
	if (err) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4682
		dev_err(&pdev->dev,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4683
			"Cannot enable PCI device from suspend\n");
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4684
		return err;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4685
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4686
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4687
	pci_set_master(pdev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4688
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4689
	pci_enable_wake(pdev, PCI_D3hot, 0);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4690
	pci_enable_wake(pdev, PCI_D3cold, 0);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4691
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4692
	e1000e_set_interrupt_capability(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4693
	if (netif_running(netdev)) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4694
		err = e1000_request_irq(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4695
		if (err)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4696
			return err;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4697
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4698
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4699
	e1000e_power_up_phy(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4700
2cefec773772 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 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4702
	if (adapter->flags2 & FLAG2_HAS_PHY_WAKEUP) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4703
		u16 phy_data;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4704
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4706
		if (phy_data) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4707
			e_info("PHY Wakeup cause - %s\n",
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4708
				phy_data & E1000_WUS_EX ? "Unicast Packet" :
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4709
				phy_data & E1000_WUS_MC ? "Multicast Packet" :
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4710
				phy_data & E1000_WUS_BC ? "Broadcast Packet" :
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4711
				phy_data & E1000_WUS_MAG ? "Magic Packet" :
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4712
				phy_data & E1000_WUS_LNKC ? "Link Status "
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4713
				" Change" : "other");
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4714
		}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4715
		e1e_wphy(&adapter->hw, BM_WUS, ~0);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4716
	} else {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4717
		u32 wus = er32(WUS);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4718
		if (wus) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4719
			e_info("MAC Wakeup cause - %s\n",
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4720
				wus & E1000_WUS_EX ? "Unicast Packet" :
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4721
				wus & E1000_WUS_MC ? "Multicast Packet" :
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4722
				wus & E1000_WUS_BC ? "Broadcast Packet" :
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4723
				wus & E1000_WUS_MAG ? "Magic Packet" :
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4724
				wus & E1000_WUS_LNKC ? "Link Status Change" :
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4725
				"other");
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4726
		}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4727
		ew32(WUS, ~0);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4728
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4729
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4730
	e1000e_reset(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4731
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4732
	e1000_init_manageability(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4733
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4734
	if (netif_running(netdev))
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4735
		e1000e_up(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4736
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4737
	netif_device_attach(netdev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4738
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4739
	/*
2cefec773772 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
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4742
	 * under the control of the driver.
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4743
	 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4744
	if (!(adapter->flags & FLAG_HAS_AMT))
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4745
		e1000_get_hw_control(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4746
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4747
	return 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4748
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4749
#endif
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4750
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4752
{
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4753
	bool wake = false;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4754
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4755
	__e1000_shutdown(pdev, &wake);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4756
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4757
	if (system_state == SYSTEM_POWER_OFF)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4758
		e1000_complete_shutdown(pdev, false, wake);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4759
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4760
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4761
#ifdef CONFIG_NET_POLL_CONTROLLER
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4762
/*
2cefec773772 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
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4765
 * the interrupt routine is executing.
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4766
 */
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4768
{
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4769
	struct e1000_adapter *adapter = netdev_priv(netdev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4770
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4771
	disable_irq(adapter->pdev->irq);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4772
	e1000_intr(adapter->pdev->irq, netdev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4773
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4774
	enable_irq(adapter->pdev->irq);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4775
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4776
#endif
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4777
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4778
/**
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4780
 * @pdev: Pointer to PCI device
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4781
 * @state: The current pci connection state
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4782
 *
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4784
 * this device has been detected.
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4785
 */
2cefec773772 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,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4787
						pci_channel_state_t state)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4788
{
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4790
	struct e1000_adapter *adapter = netdev_priv(netdev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4791
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4792
	netif_device_detach(netdev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4793
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4794
	if (state == pci_channel_io_perm_failure)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4795
		return PCI_ERS_RESULT_DISCONNECT;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4796
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4797
	if (netif_running(netdev))
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4798
		e1000e_down(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4799
	pci_disable_device(pdev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4800
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4801
	/* Request a slot slot reset. */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4802
	return PCI_ERS_RESULT_NEED_RESET;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4803
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4804
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4805
/**
2cefec773772 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.
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4807
 * @pdev: Pointer to PCI device
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4808
 *
2cefec773772 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
2cefec773772 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.
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4811
 */
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4813
{
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4815
	struct e1000_adapter *adapter = netdev_priv(netdev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4816
	struct e1000_hw *hw = &adapter->hw;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4817
	int err;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4818
	pci_ers_result_t result;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4819
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4820
	e1000e_disable_l1aspm(pdev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4821
	err = pci_enable_device_mem(pdev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4822
	if (err) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4823
		dev_err(&pdev->dev,
2cefec773772 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");
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4825
		result = PCI_ERS_RESULT_DISCONNECT;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4826
	} else {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4827
		pci_set_master(pdev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4828
		pci_restore_state(pdev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4829
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4830
		pci_enable_wake(pdev, PCI_D3hot, 0);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4831
		pci_enable_wake(pdev, PCI_D3cold, 0);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4832
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4833
		e1000e_reset(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4834
		ew32(WUS, ~0);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4835
		result = PCI_ERS_RESULT_RECOVERED;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4836
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4837
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4838
	pci_cleanup_aer_uncorrect_error_status(pdev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4839
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4840
	return result;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4841
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4842
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4843
/**
2cefec773772 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.
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4845
 * @pdev: Pointer to PCI device
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4846
 *
2cefec773772 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
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4849
 * second-half of the e1000_resume routine.
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4850
 */
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4852
{
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4854
	struct e1000_adapter *adapter = netdev_priv(netdev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4855
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4856
	e1000_init_manageability(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4857
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4858
	if (netif_running(netdev)) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4859
		if (e1000e_up(adapter)) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4860
			dev_err(&pdev->dev,
2cefec773772 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");
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4862
			return;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4863
		}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4864
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4865
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4866
	netif_device_attach(netdev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4867
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4868
	/*
2cefec773772 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
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4871
	 * under the control of the driver.
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4872
	 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4873
	if (!(adapter->flags & FLAG_HAS_AMT))
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4874
		e1000_get_hw_control(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4875
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4876
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4877
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4879
{
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4880
	struct e1000_hw *hw = &adapter->hw;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4881
	struct net_device *netdev = adapter->netdev;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4882
	u32 pba_num;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4883
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4884
	/* print bus type/speed/width info */
2cefec773772 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",
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4886
	       /* bus width */
2cefec773772 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" :
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4888
	        "Width x1"),
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4889
	       /* MAC address */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4890
	       netdev->dev_addr);
2cefec773772 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",
2cefec773772 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");
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4893
	e1000e_read_pba_num(hw, &pba_num);
2cefec773772 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",
2cefec773772 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));
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4896
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4897
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4899
{
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4900
	struct e1000_hw *hw = &adapter->hw;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4901
	int ret_val;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4902
	u16 buf = 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4903
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4904
	if (hw->mac.type != e1000_82573)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4905
		return;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4906
2cefec773772 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);
2cefec773772 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)))) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4909
		/* Deep Smart Power Down (DSPD) */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4910
		dev_warn(&adapter->pdev->dev,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4911
			 "Warning: detected DSPD enabled in EEPROM\n");
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4912
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4913
2cefec773772 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);
2cefec773772 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))) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4916
		/* ASPM enable */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4917
		dev_warn(&adapter->pdev->dev,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4918
			 "Warning: detected ASPM enabled in EEPROM\n");
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4919
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4920
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4921
2cefec773772 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 = {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4923
	.ndo_open		= e1000_open,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4924
	.ndo_stop		= e1000_close,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4925
	.ndo_start_xmit		= e1000_xmit_frame,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4926
	.ndo_get_stats		= e1000_get_stats,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4927
	.ndo_set_multicast_list	= e1000_set_multi,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4928
	.ndo_set_mac_address	= e1000_set_mac,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4929
	.ndo_change_mtu		= e1000_change_mtu,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4930
	.ndo_do_ioctl		= e1000_ioctl,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4931
	.ndo_tx_timeout		= e1000_tx_timeout,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4932
	.ndo_validate_addr	= eth_validate_addr,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4933
2cefec773772 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,
2cefec773772 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,
2cefec773772 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,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4937
#ifdef CONFIG_NET_POLL_CONTROLLER
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4938
	.ndo_poll_controller	= e1000_netpoll,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4939
#endif
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4940
};
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4941
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4942
/**
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4943
 * e1000_probe - Device Initialization Routine
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4944
 * @pdev: PCI device information struct
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4945
 * @ent: entry in e1000_pci_tbl
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4946
 *
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4947
 * Returns 0 on success, negative on failure
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4948
 *
2cefec773772 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.
2cefec773772 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,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4951
 * and a hardware reset occur.
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4952
 **/
2cefec773772 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,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4954
				 const struct pci_device_id *ent)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4955
{
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4956
	struct net_device *netdev;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4957
	struct e1000_adapter *adapter;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4958
	struct e1000_hw *hw;
2cefec773772 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];
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4960
	resource_size_t mmio_start, mmio_len;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4961
	resource_size_t flash_start, flash_len;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4962
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4963
	static int cards_found;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4964
	int i, err, pci_using_dac;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4965
	u16 eeprom_data = 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4966
	u16 eeprom_apme_mask = E1000_EEPROM_APME;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4967
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4968
	e1000e_disable_l1aspm(pdev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4969
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4970
	err = pci_enable_device_mem(pdev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4971
	if (err)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4972
		return err;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4973
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4974
	pci_using_dac = 0;
2cefec773772 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));
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4976
	if (!err) {
2cefec773772 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));
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4978
		if (!err)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4979
			pci_using_dac = 1;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4980
	} else {
2cefec773772 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));
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4982
		if (err) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4983
			err = pci_set_consistent_dma_mask(pdev,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4984
							  DMA_BIT_MASK(32));
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4985
			if (err) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4986
				dev_err(&pdev->dev, "No usable DMA "
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4987
					"configuration, aborting\n");
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4988
				goto err_dma;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4989
			}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4990
		}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4991
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4992
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4993
	err = pci_request_selected_regions_exclusive(pdev,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4994
	                                  pci_select_bars(pdev, IORESOURCE_MEM),
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4995
	                                  e1000e_driver_name);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4996
	if (err)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4997
		goto err_pci_reg;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4998
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4999
	/* AER (Advanced Error Reporting) hooks */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5000
	pci_enable_pcie_error_reporting(pdev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5001
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5002
	pci_set_master(pdev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5003
	/* PCI config space info */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5004
	err = pci_save_state(pdev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5005
	if (err)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5006
		goto err_alloc_etherdev;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5007
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5008
	err = -ENOMEM;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5009
	netdev = alloc_etherdev(sizeof(struct e1000_adapter));
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5010
	if (!netdev)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5011
		goto err_alloc_etherdev;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5012
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5013
	SET_NETDEV_DEV(netdev, &pdev->dev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5014
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5015
	pci_set_drvdata(pdev, netdev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5016
	adapter = netdev_priv(netdev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5017
	hw = &adapter->hw;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5018
	adapter->netdev = netdev;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5019
	adapter->pdev = pdev;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5020
	adapter->ei = ei;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5021
	adapter->pba = ei->pba;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5022
	adapter->flags = ei->flags;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5023
	adapter->flags2 = ei->flags2;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5024
	adapter->hw.adapter = adapter;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5025
	adapter->hw.mac.type = ei->mac;
2cefec773772 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;
2cefec773772 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;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5028
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5029
	mmio_start = pci_resource_start(pdev, 0);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5030
	mmio_len = pci_resource_len(pdev, 0);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5031
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5032
	err = -EIO;
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5034
	if (!adapter->hw.hw_addr)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5035
		goto err_ioremap;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5036
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5037
	if ((adapter->flags & FLAG_HAS_FLASH) &&
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5038
	    (pci_resource_flags(pdev, 1) & IORESOURCE_MEM)) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5039
		flash_start = pci_resource_start(pdev, 1);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5040
		flash_len = pci_resource_len(pdev, 1);
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5042
		if (!adapter->hw.flash_address)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5043
			goto err_flashmap;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5044
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5045
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5046
	/* construct the net_device struct */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5047
	netdev->netdev_ops		= &e1000e_netdev_ops;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5048
	e1000e_set_ethtool_ops(netdev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5049
	netdev->watchdog_timeo		= 5 * HZ;
2cefec773772 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);
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5052
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5053
	netdev->mem_start = mmio_start;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5054
	netdev->mem_end = mmio_start + mmio_len;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5055
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5056
	adapter->bd_number = cards_found++;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5057
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5058
	e1000e_check_options(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5059
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5060
	/* setup adapter struct */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5061
	err = e1000_sw_init(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5062
	if (err)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5063
		goto err_sw_init;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5064
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5065
	err = -EIO;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5066
2cefec773772 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));
2cefec773772 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));
2cefec773772 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));
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5070
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5071
	err = ei->get_variants(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5072
	if (err)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5073
		goto err_hw_init;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5074
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5075
	if ((adapter->flags & FLAG_IS_ICH) &&
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5076
	    (adapter->flags & FLAG_READ_ONLY_NVM))
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5077
		e1000e_write_protect_nvm_ich8lan(&adapter->hw);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5078
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5080
2cefec773772 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;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5082
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5083
	/* Copper options */
2cefec773772 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) {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5085
		adapter->hw.phy.mdix = AUTO_ALL_MODES;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5086
		adapter->hw.phy.disable_polarity_correction = 0;
2cefec773772 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;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5088
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5089
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5090
	if (e1000_check_reset_block(&adapter->hw))
2cefec773772 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");
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5092
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5093
	netdev->features = NETIF_F_SG |
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5094
			   NETIF_F_HW_CSUM |
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5095
			   NETIF_F_HW_VLAN_TX |
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5096
			   NETIF_F_HW_VLAN_RX;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5097
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5099
		netdev->features |= NETIF_F_HW_VLAN_FILTER;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5100
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5101
	netdev->features |= NETIF_F_TSO;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5102
	netdev->features |= NETIF_F_TSO6;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5103
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5104
	netdev->vlan_features |= NETIF_F_TSO;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5105
	netdev->vlan_features |= NETIF_F_TSO6;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5106
	netdev->vlan_features |= NETIF_F_HW_CSUM;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5107
	netdev->vlan_features |= NETIF_F_SG;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5108
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5109
	if (pci_using_dac)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5110
		netdev->features |= NETIF_F_HIGHDMA;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5111
2cefec773772 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))
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5113
		adapter->flags |= FLAG_MNG_PT_ENABLED;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5114
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5115
	/*
2cefec773772 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
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5118
	 */
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5120
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5121
	/*
2cefec773772 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
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5124
	 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5125
	for (i = 0;; i++) {
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5127
			break;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5128
		if (i == 2) {
2cefec773772 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");
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5130
			err = -EIO;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5131
			goto err_eeprom;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5132
		}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5133
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5134
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5135
	e1000_eeprom_checks(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5136
2cefec773772 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 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5138
	if (e1000e_read_mac_addr(&adapter->hw))
2cefec773772 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");
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5140
2cefec773772 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);
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5143
2cefec773772 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)) {
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5146
		err = -EIO;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5147
		goto err_eeprom;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5148
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5149
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5150
	init_timer(&adapter->watchdog_timer);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5151
	adapter->watchdog_timer.function = &e1000_watchdog;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5152
	adapter->watchdog_timer.data = (unsigned long) adapter;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5153
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5154
	init_timer(&adapter->phy_info_timer);
2cefec773772 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;
2cefec773772 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;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5157
2cefec773772 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);
2cefec773772 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);
2cefec773772 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);
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5162
2cefec773772 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 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5164
	adapter->hw.mac.autoneg = 1;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5165
	adapter->fc_autoneg = 1;
2cefec773772 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;
2cefec773772 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;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5168
	adapter->hw.phy.autoneg_advertised = 0x2f;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5169
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5170
	/* ring size defaults */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5171
	adapter->rx_ring->count = 256;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5172
	adapter->tx_ring->count = 256;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5173
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5174
	/*
2cefec773772 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
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5177
	 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5178
	if (adapter->flags & FLAG_APME_IN_WUC) {
2cefec773772 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 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5180
		eeprom_data = er32(WUC);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5181
		eeprom_apme_mask = E1000_WUC_APME;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5182
		if (eeprom_data & E1000_WUC_PHY_WAKE)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5183
			adapter->flags2 |= FLAG2_HAS_PHY_WAKEUP;
2cefec773772 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) {
2cefec773772 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 &&
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5186
		    (adapter->hw.bus.func == 1))
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5187
			e1000_read_nvm(&adapter->hw,
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5189
		else
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5190
			e1000_read_nvm(&adapter->hw,
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5192
	}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5193
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5194
	/* fetch WoL from EEPROM */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5195
	if (eeprom_data & eeprom_apme_mask)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5196
		adapter->eeprom_wol |= E1000_WUFC_MAG;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5197
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5198
	/*
2cefec773772 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
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5201
	 * wake on lan on a particular port
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5202
	 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5203
	if (!(adapter->flags & FLAG_HAS_WOL))
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5204
		adapter->eeprom_wol = 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5205
2cefec773772 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 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5207
	adapter->wol = adapter->eeprom_wol;
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5209
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5210
	/* save off EEPROM version number */
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5212
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5213
	/* reset the hardware with the new settings */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5214
	e1000e_reset(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5215
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5216
	/*
2cefec773772 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
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5219
	 * under the control of the driver.
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5220
	 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5221
	if (!(adapter->flags & FLAG_HAS_AMT))
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5222
		e1000_get_hw_control(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5223
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5224
	strcpy(netdev->name, "eth%d");
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5225
	err = register_netdev(netdev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5226
	if (err)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5227
		goto err_register;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5228
2cefec773772 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 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5230
	netif_carrier_off(netdev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5231
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5232
	e1000_print_device_info(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5233
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5234
	return 0;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5235
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5236
err_register:
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5237
	if (!(adapter->flags & FLAG_HAS_AMT))
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5238
		e1000_release_hw_control(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5239
err_eeprom:
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5240
	if (!e1000_check_reset_block(&adapter->hw))
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5241
		e1000_phy_hw_reset(&adapter->hw);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5242
err_hw_init:
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5243
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5244
	kfree(adapter->tx_ring);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5245
	kfree(adapter->rx_ring);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5246
err_sw_init:
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5247
	if (adapter->hw.flash_address)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5248
		iounmap(adapter->hw.flash_address);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5249
	e1000e_reset_interrupt_capability(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5250
err_flashmap:
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5251
	iounmap(adapter->hw.hw_addr);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5252
err_ioremap:
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5253
	free_netdev(netdev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5254
err_alloc_etherdev:
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5255
	pci_release_selected_regions(pdev,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5256
	                             pci_select_bars(pdev, IORESOURCE_MEM));
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5257
err_pci_reg:
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5258
err_dma:
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5259
	pci_disable_device(pdev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5260
	return err;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5261
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5262
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5263
/**
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5264
 * e1000_remove - Device Removal Routine
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5265
 * @pdev: PCI device information struct
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5266
 *
2cefec773772 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
2cefec773772 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
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5270
 * memory.
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5271
 **/
2cefec773772 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)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5273
{
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5275
	struct e1000_adapter *adapter = netdev_priv(netdev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5276
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5277
	/*
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5279
	 * explicitly disable watchdog tasks from being rescheduled
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5280
	 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5281
	set_bit(__E1000_DOWN, &adapter->state);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5282
	del_timer_sync(&adapter->watchdog_timer);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5283
	del_timer_sync(&adapter->phy_info_timer);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5284
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5285
	flush_scheduled_work();
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5286
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5287
	/*
2cefec773772 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
2cefec773772 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.
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5290
	 */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5291
	e1000_release_hw_control(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5292
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5293
	unregister_netdev(netdev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5294
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5295
	if (!e1000_check_reset_block(&adapter->hw))
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5296
		e1000_phy_hw_reset(&adapter->hw);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5297
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5298
	e1000e_reset_interrupt_capability(adapter);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5299
	kfree(adapter->tx_ring);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5300
	kfree(adapter->rx_ring);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5301
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5302
	iounmap(adapter->hw.hw_addr);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5303
	if (adapter->hw.flash_address)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5304
		iounmap(adapter->hw.flash_address);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5305
	pci_release_selected_regions(pdev,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5306
	                             pci_select_bars(pdev, IORESOURCE_MEM));
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5307
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5308
	free_netdev(netdev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5309
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5310
	/* AER disable */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5311
	pci_disable_pcie_error_reporting(pdev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5312
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5313
	pci_disable_device(pdev);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5314
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5315
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5316
/* PCI Error Recovery (ERS) */
2cefec773772 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 = {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5318
	.error_detected = e1000_io_error_detected,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5319
	.slot_reset = e1000_io_slot_reset,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5320
	.resume = e1000_io_resume,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5321
};
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5322
2cefec773772 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[] = {
2cefec773772 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 },
2cefec773772 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 },
2cefec773772 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 },
2cefec773772 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 },
2cefec773772 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 },
2cefec773772 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 },
2cefec773772 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 },
2cefec773772 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 },
2cefec773772 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 },
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5333
2cefec773772 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 },
2cefec773772 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 },
2cefec773772 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 },
2cefec773772 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 },
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5338
2cefec773772 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 },
2cefec773772 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 },
2cefec773772 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 },
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5342
2cefec773772 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 },
2cefec773772 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 },
2cefec773772 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 },
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5346
2cefec773772 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),
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5348
	  board_80003es2lan },
2cefec773772 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),
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5350
	  board_80003es2lan },
2cefec773772 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),
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5352
	  board_80003es2lan },
2cefec773772 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),
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5354
	  board_80003es2lan },
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5355
2cefec773772 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 },
2cefec773772 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 },
2cefec773772 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 },
2cefec773772 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 },
2cefec773772 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 },
2cefec773772 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 },
2cefec773772 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 },
2cefec773772 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 },
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5364
2cefec773772 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 },
2cefec773772 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 },
2cefec773772 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 },
2cefec773772 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 },
2cefec773772 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 },
2cefec773772 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 },
2cefec773772 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 },
2cefec773772 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 },
2cefec773772 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 },
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5374
2cefec773772 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 },
2cefec773772 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 },
2cefec773772 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 },
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5378
2cefec773772 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 },
2cefec773772 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 },
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5381
2cefec773772 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 },
2cefec773772 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 },
2cefec773772 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 },
2cefec773772 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 },
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5386
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5387
	{ }	/* terminate list */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5388
};
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5389
MODULE_DEVICE_TABLE(pci, e1000_pci_tbl);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5390
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5391
/* PCI Device API Driver */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5392
static struct pci_driver e1000_driver = {
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5393
	.name     = e1000e_driver_name,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5394
	.id_table = e1000_pci_tbl,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5395
	.probe    = e1000_probe,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5396
	.remove   = __devexit_p(e1000_remove),
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5397
#ifdef CONFIG_PM
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5398
	/* Power Management Hooks */
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5399
	.suspend  = e1000_suspend,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5400
	.resume   = e1000_resume,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5401
#endif
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5402
	.shutdown = e1000_shutdown,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5403
	.err_handler = &e1000_err_handler
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5404
};
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5405
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5406
/**
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5407
 * e1000_init_module - Driver Registration Routine
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5408
 *
2cefec773772 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
2cefec773772 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.
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5411
 **/
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5412
static int __init e1000_init_module(void)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5413
{
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5414
	int ret;
2cefec773772 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",
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5416
	       e1000e_driver_name, e1000e_driver_version);
2cefec773772 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",
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5418
	       e1000e_driver_name);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5419
	ret = pci_register_driver(&e1000_driver);
2cefec773772 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,
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5421
			       PM_QOS_DEFAULT_VALUE);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5422
				
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5423
	return ret;
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5424
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5425
module_init(e1000_init_module);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5426
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5427
/**
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5428
 * e1000_exit_module - Driver Exit Cleanup Routine
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5429
 *
2cefec773772 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
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5431
 * from memory.
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5432
 **/
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5433
static void __exit e1000_exit_module(void)
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5434
{
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5435
	pci_unregister_driver(&e1000_driver);
2cefec773772 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);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5437
}
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5438
module_exit(e1000_exit_module);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5439
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5440
2cefec773772 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>");
2cefec773772 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");
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5443
MODULE_LICENSE("GPL");
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5444
MODULE_VERSION(DRV_VERSION);
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5445
2cefec773772 Added e1000e driver for 2.6.32.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5446
/* e1000_main.c */