devices/e1000e/netdev-2.6.34-orig.c
author Knud Baastrup <kba@deif.com>
Tue, 14 Apr 2015 13:12:24 -0400
changeset 2629 a2701af27fde
parent 2076 1baafcd263cc
permissions -rw-r--r--
Internal SDO requests now synchronized with external requests.
Internal SDO requests are managed by master FSM and can conflict with
external requests managed by slave FSM. The internal SDO requests
includes SDO requests created by an application and external request are
typical created by EtherCAT Tool for SDO upload/download or a directory
fetch initiated with ethercat sdos command. The conflict will cause a
FPWR from an external request to be overwritten by a FPWR from an
internal SDO request (or oppersite) in the same "train" of datagrams.
2076
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     1
/*******************************************************************************
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     2
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     3
  Intel PRO/1000 Linux driver
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     4
  Copyright(c) 1999 - 2009 Intel Corporation.
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     5
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     6
  This program is free software; you can redistribute it and/or modify it
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     7
  under the terms and conditions of the GNU General Public License,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     8
  version 2, as published by the Free Software Foundation.
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     9
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    10
  This program is distributed in the hope it will be useful, but WITHOUT
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    11
  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    12
  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    13
  more details.
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    14
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    15
  You should have received a copy of the GNU General Public License along with
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    16
  this program; if not, write to the Free Software Foundation, Inc.,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    17
  51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    18
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    19
  The full GNU General Public License is included in this distribution in
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    20
  the file called "COPYING".
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    21
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    22
  Contact Information:
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    23
  Linux NICS <linux.nics@intel.com>
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    24
  e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    25
  Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    26
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    27
*******************************************************************************/
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    28
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    29
#include <linux/module.h>
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    30
#include <linux/types.h>
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    31
#include <linux/init.h>
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    32
#include <linux/pci.h>
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    33
#include <linux/vmalloc.h>
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    34
#include <linux/pagemap.h>
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    35
#include <linux/delay.h>
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    36
#include <linux/netdevice.h>
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    37
#include <linux/tcp.h>
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    38
#include <linux/ipv6.h>
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    39
#include <linux/slab.h>
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    40
#include <net/checksum.h>
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    41
#include <net/ip6_checksum.h>
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    42
#include <linux/mii.h>
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    43
#include <linux/ethtool.h>
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    44
#include <linux/if_vlan.h>
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    45
#include <linux/cpu.h>
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    46
#include <linux/smp.h>
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    47
#include <linux/pm_qos_params.h>
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    48
#include <linux/aer.h>
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    49
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    50
#include "e1000.h"
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    51
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    52
#define DRV_VERSION "1.0.2-k2"
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    53
char e1000e_driver_name[] = "e1000e";
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    54
const char e1000e_driver_version[] = DRV_VERSION;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    55
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    56
static const struct e1000_info *e1000_info_tbl[] = {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    57
	[board_82571]		= &e1000_82571_info,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    58
	[board_82572]		= &e1000_82572_info,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    59
	[board_82573]		= &e1000_82573_info,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    60
	[board_82574]		= &e1000_82574_info,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    61
	[board_82583]		= &e1000_82583_info,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    62
	[board_80003es2lan]	= &e1000_es2_info,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    63
	[board_ich8lan]		= &e1000_ich8_info,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    64
	[board_ich9lan]		= &e1000_ich9_info,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    65
	[board_ich10lan]	= &e1000_ich10_info,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    66
	[board_pchlan]		= &e1000_pch_info,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    67
};
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    68
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    69
/**
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    70
 * e1000_desc_unused - calculate if we have unused descriptors
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    71
 **/
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    72
static int e1000_desc_unused(struct e1000_ring *ring)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    73
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    74
	if (ring->next_to_clean > ring->next_to_use)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    75
		return ring->next_to_clean - ring->next_to_use - 1;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    76
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    77
	return ring->count + ring->next_to_clean - ring->next_to_use - 1;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    78
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    79
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    80
/**
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    81
 * e1000_receive_skb - helper function to handle Rx indications
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    82
 * @adapter: board private structure
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    83
 * @status: descriptor status field as written by hardware
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    84
 * @vlan: descriptor vlan field as written by hardware (no le/be conversion)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    85
 * @skb: pointer to sk_buff to be indicated to stack
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    86
 **/
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    87
static void e1000_receive_skb(struct e1000_adapter *adapter,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    88
			      struct net_device *netdev,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    89
			      struct sk_buff *skb,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    90
			      u8 status, __le16 vlan)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    91
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    92
	skb->protocol = eth_type_trans(skb, netdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    93
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    94
	if (adapter->vlgrp && (status & E1000_RXD_STAT_VP))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    95
		vlan_gro_receive(&adapter->napi, adapter->vlgrp,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    96
				 le16_to_cpu(vlan), skb);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    97
	else
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    98
		napi_gro_receive(&adapter->napi, skb);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    99
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   100
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   101
/**
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   102
 * e1000_rx_checksum - Receive Checksum Offload for 82543
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   103
 * @adapter:     board private structure
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   104
 * @status_err:  receive descriptor status and error fields
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   105
 * @csum:	receive descriptor csum field
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   106
 * @sk_buff:     socket buffer with received data
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   107
 **/
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   108
static void e1000_rx_checksum(struct e1000_adapter *adapter, u32 status_err,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   109
			      u32 csum, struct sk_buff *skb)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   110
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   111
	u16 status = (u16)status_err;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   112
	u8 errors = (u8)(status_err >> 24);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   113
	skb->ip_summed = CHECKSUM_NONE;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   114
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   115
	/* Ignore Checksum bit is set */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   116
	if (status & E1000_RXD_STAT_IXSM)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   117
		return;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   118
	/* TCP/UDP checksum error bit is set */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   119
	if (errors & E1000_RXD_ERR_TCPE) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   120
		/* let the stack verify checksum errors */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   121
		adapter->hw_csum_err++;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   122
		return;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   123
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   124
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   125
	/* TCP/UDP Checksum has not been calculated */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   126
	if (!(status & (E1000_RXD_STAT_TCPCS | E1000_RXD_STAT_UDPCS)))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   127
		return;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   128
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   129
	/* It must be a TCP or UDP packet with a valid checksum */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   130
	if (status & E1000_RXD_STAT_TCPCS) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   131
		/* TCP checksum is good */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   132
		skb->ip_summed = CHECKSUM_UNNECESSARY;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   133
	} else {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   134
		/*
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   135
		 * IP fragment with UDP payload
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   136
		 * Hardware complements the payload checksum, so we undo it
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   137
		 * and then put the value in host order for further stack use.
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   138
		 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   139
		__sum16 sum = (__force __sum16)htons(csum);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   140
		skb->csum = csum_unfold(~sum);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   141
		skb->ip_summed = CHECKSUM_COMPLETE;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   142
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   143
	adapter->hw_csum_good++;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   144
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   145
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   146
/**
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   147
 * e1000_alloc_rx_buffers - Replace used receive buffers; legacy & extended
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   148
 * @adapter: address of board private structure
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   149
 **/
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   150
static void e1000_alloc_rx_buffers(struct e1000_adapter *adapter,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   151
				   int cleaned_count)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   152
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   153
	struct net_device *netdev = adapter->netdev;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   154
	struct pci_dev *pdev = adapter->pdev;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   155
	struct e1000_ring *rx_ring = adapter->rx_ring;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   156
	struct e1000_rx_desc *rx_desc;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   157
	struct e1000_buffer *buffer_info;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   158
	struct sk_buff *skb;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   159
	unsigned int i;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   160
	unsigned int bufsz = adapter->rx_buffer_len;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   161
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   162
	i = rx_ring->next_to_use;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   163
	buffer_info = &rx_ring->buffer_info[i];
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   164
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   165
	while (cleaned_count--) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   166
		skb = buffer_info->skb;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   167
		if (skb) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   168
			skb_trim(skb, 0);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   169
			goto map_skb;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   170
		}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   171
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   172
		skb = netdev_alloc_skb_ip_align(netdev, bufsz);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   173
		if (!skb) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   174
			/* Better luck next round */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   175
			adapter->alloc_rx_buff_failed++;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   176
			break;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   177
		}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   178
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   179
		buffer_info->skb = skb;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   180
map_skb:
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   181
		buffer_info->dma = pci_map_single(pdev, skb->data,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   182
						  adapter->rx_buffer_len,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   183
						  PCI_DMA_FROMDEVICE);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   184
		if (pci_dma_mapping_error(pdev, buffer_info->dma)) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   185
			dev_err(&pdev->dev, "RX DMA map failed\n");
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   186
			adapter->rx_dma_failed++;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   187
			break;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   188
		}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   189
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   190
		rx_desc = E1000_RX_DESC(*rx_ring, i);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   191
		rx_desc->buffer_addr = cpu_to_le64(buffer_info->dma);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   192
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   193
		i++;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   194
		if (i == rx_ring->count)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   195
			i = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   196
		buffer_info = &rx_ring->buffer_info[i];
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   197
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   198
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   199
	if (rx_ring->next_to_use != i) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   200
		rx_ring->next_to_use = i;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   201
		if (i-- == 0)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   202
			i = (rx_ring->count - 1);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   203
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   204
		/*
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   205
		 * Force memory writes to complete before letting h/w
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   206
		 * know there are new descriptors to fetch.  (Only
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   207
		 * applicable for weak-ordered memory model archs,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   208
		 * such as IA-64).
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   209
		 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   210
		wmb();
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   211
		writel(i, adapter->hw.hw_addr + rx_ring->tail);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   212
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   213
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   214
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   215
/**
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   216
 * e1000_alloc_rx_buffers_ps - Replace used receive buffers; packet split
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   217
 * @adapter: address of board private structure
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   218
 **/
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   219
static void e1000_alloc_rx_buffers_ps(struct e1000_adapter *adapter,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   220
				      int cleaned_count)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   221
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   222
	struct net_device *netdev = adapter->netdev;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   223
	struct pci_dev *pdev = adapter->pdev;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   224
	union e1000_rx_desc_packet_split *rx_desc;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   225
	struct e1000_ring *rx_ring = adapter->rx_ring;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   226
	struct e1000_buffer *buffer_info;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   227
	struct e1000_ps_page *ps_page;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   228
	struct sk_buff *skb;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   229
	unsigned int i, j;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   230
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   231
	i = rx_ring->next_to_use;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   232
	buffer_info = &rx_ring->buffer_info[i];
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   233
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   234
	while (cleaned_count--) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   235
		rx_desc = E1000_RX_DESC_PS(*rx_ring, i);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   236
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   237
		for (j = 0; j < PS_PAGE_BUFFERS; j++) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   238
			ps_page = &buffer_info->ps_pages[j];
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   239
			if (j >= adapter->rx_ps_pages) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   240
				/* all unused desc entries get hw null ptr */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   241
				rx_desc->read.buffer_addr[j+1] = ~cpu_to_le64(0);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   242
				continue;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   243
			}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   244
			if (!ps_page->page) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   245
				ps_page->page = alloc_page(GFP_ATOMIC);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   246
				if (!ps_page->page) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   247
					adapter->alloc_rx_buff_failed++;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   248
					goto no_buffers;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   249
				}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   250
				ps_page->dma = pci_map_page(pdev,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   251
						   ps_page->page,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   252
						   0, PAGE_SIZE,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   253
						   PCI_DMA_FROMDEVICE);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   254
				if (pci_dma_mapping_error(pdev, ps_page->dma)) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   255
					dev_err(&adapter->pdev->dev,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   256
					  "RX DMA page map failed\n");
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   257
					adapter->rx_dma_failed++;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   258
					goto no_buffers;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   259
				}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   260
			}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   261
			/*
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   262
			 * Refresh the desc even if buffer_addrs
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   263
			 * didn't change because each write-back
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   264
			 * erases this info.
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   265
			 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   266
			rx_desc->read.buffer_addr[j+1] =
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   267
			     cpu_to_le64(ps_page->dma);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   268
		}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   269
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   270
		skb = netdev_alloc_skb_ip_align(netdev,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   271
						adapter->rx_ps_bsize0);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   272
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   273
		if (!skb) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   274
			adapter->alloc_rx_buff_failed++;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   275
			break;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   276
		}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   277
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   278
		buffer_info->skb = skb;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   279
		buffer_info->dma = pci_map_single(pdev, skb->data,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   280
						  adapter->rx_ps_bsize0,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   281
						  PCI_DMA_FROMDEVICE);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   282
		if (pci_dma_mapping_error(pdev, buffer_info->dma)) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   283
			dev_err(&pdev->dev, "RX DMA map failed\n");
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   284
			adapter->rx_dma_failed++;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   285
			/* cleanup skb */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   286
			dev_kfree_skb_any(skb);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   287
			buffer_info->skb = NULL;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   288
			break;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   289
		}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   290
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   291
		rx_desc->read.buffer_addr[0] = cpu_to_le64(buffer_info->dma);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   292
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   293
		i++;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   294
		if (i == rx_ring->count)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   295
			i = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   296
		buffer_info = &rx_ring->buffer_info[i];
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   297
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   298
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   299
no_buffers:
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   300
	if (rx_ring->next_to_use != i) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   301
		rx_ring->next_to_use = i;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   302
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   303
		if (!(i--))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   304
			i = (rx_ring->count - 1);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   305
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   306
		/*
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   307
		 * Force memory writes to complete before letting h/w
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   308
		 * know there are new descriptors to fetch.  (Only
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   309
		 * applicable for weak-ordered memory model archs,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   310
		 * such as IA-64).
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   311
		 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   312
		wmb();
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   313
		/*
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   314
		 * Hardware increments by 16 bytes, but packet split
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   315
		 * descriptors are 32 bytes...so we increment tail
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   316
		 * twice as much.
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   317
		 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   318
		writel(i<<1, adapter->hw.hw_addr + rx_ring->tail);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   319
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   320
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   321
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   322
/**
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   323
 * e1000_alloc_jumbo_rx_buffers - Replace used jumbo receive buffers
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   324
 * @adapter: address of board private structure
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   325
 * @cleaned_count: number of buffers to allocate this pass
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   326
 **/
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   327
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   328
static void e1000_alloc_jumbo_rx_buffers(struct e1000_adapter *adapter,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   329
                                         int cleaned_count)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   330
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   331
	struct net_device *netdev = adapter->netdev;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   332
	struct pci_dev *pdev = adapter->pdev;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   333
	struct e1000_rx_desc *rx_desc;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   334
	struct e1000_ring *rx_ring = adapter->rx_ring;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   335
	struct e1000_buffer *buffer_info;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   336
	struct sk_buff *skb;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   337
	unsigned int i;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   338
	unsigned int bufsz = 256 - 16 /* for skb_reserve */;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   339
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   340
	i = rx_ring->next_to_use;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   341
	buffer_info = &rx_ring->buffer_info[i];
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   342
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   343
	while (cleaned_count--) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   344
		skb = buffer_info->skb;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   345
		if (skb) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   346
			skb_trim(skb, 0);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   347
			goto check_page;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   348
		}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   349
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   350
		skb = netdev_alloc_skb_ip_align(netdev, bufsz);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   351
		if (unlikely(!skb)) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   352
			/* Better luck next round */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   353
			adapter->alloc_rx_buff_failed++;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   354
			break;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   355
		}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   356
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   357
		buffer_info->skb = skb;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   358
check_page:
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   359
		/* allocate a new page if necessary */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   360
		if (!buffer_info->page) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   361
			buffer_info->page = alloc_page(GFP_ATOMIC);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   362
			if (unlikely(!buffer_info->page)) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   363
				adapter->alloc_rx_buff_failed++;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   364
				break;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   365
			}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   366
		}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   367
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   368
		if (!buffer_info->dma)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   369
			buffer_info->dma = pci_map_page(pdev,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   370
			                                buffer_info->page, 0,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   371
			                                PAGE_SIZE,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   372
			                                PCI_DMA_FROMDEVICE);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   373
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   374
		rx_desc = E1000_RX_DESC(*rx_ring, i);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   375
		rx_desc->buffer_addr = cpu_to_le64(buffer_info->dma);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   376
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   377
		if (unlikely(++i == rx_ring->count))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   378
			i = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   379
		buffer_info = &rx_ring->buffer_info[i];
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   380
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   381
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   382
	if (likely(rx_ring->next_to_use != i)) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   383
		rx_ring->next_to_use = i;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   384
		if (unlikely(i-- == 0))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   385
			i = (rx_ring->count - 1);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   386
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   387
		/* Force memory writes to complete before letting h/w
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   388
		 * know there are new descriptors to fetch.  (Only
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   389
		 * applicable for weak-ordered memory model archs,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   390
		 * such as IA-64). */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   391
		wmb();
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   392
		writel(i, adapter->hw.hw_addr + rx_ring->tail);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   393
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   394
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   395
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   396
/**
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   397
 * e1000_clean_rx_irq - Send received data up the network stack; legacy
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   398
 * @adapter: board private structure
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   399
 *
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   400
 * the return value indicates whether actual cleaning was done, there
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   401
 * is no guarantee that everything was cleaned
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   402
 **/
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   403
static bool e1000_clean_rx_irq(struct e1000_adapter *adapter,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   404
			       int *work_done, int work_to_do)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   405
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   406
	struct net_device *netdev = adapter->netdev;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   407
	struct pci_dev *pdev = adapter->pdev;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   408
	struct e1000_hw *hw = &adapter->hw;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   409
	struct e1000_ring *rx_ring = adapter->rx_ring;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   410
	struct e1000_rx_desc *rx_desc, *next_rxd;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   411
	struct e1000_buffer *buffer_info, *next_buffer;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   412
	u32 length;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   413
	unsigned int i;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   414
	int cleaned_count = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   415
	bool cleaned = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   416
	unsigned int total_rx_bytes = 0, total_rx_packets = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   417
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   418
	i = rx_ring->next_to_clean;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   419
	rx_desc = E1000_RX_DESC(*rx_ring, i);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   420
	buffer_info = &rx_ring->buffer_info[i];
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   421
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   422
	while (rx_desc->status & E1000_RXD_STAT_DD) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   423
		struct sk_buff *skb;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   424
		u8 status;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   425
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   426
		if (*work_done >= work_to_do)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   427
			break;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   428
		(*work_done)++;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   429
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   430
		status = rx_desc->status;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   431
		skb = buffer_info->skb;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   432
		buffer_info->skb = NULL;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   433
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   434
		prefetch(skb->data - NET_IP_ALIGN);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   435
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   436
		i++;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   437
		if (i == rx_ring->count)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   438
			i = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   439
		next_rxd = E1000_RX_DESC(*rx_ring, i);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   440
		prefetch(next_rxd);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   441
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   442
		next_buffer = &rx_ring->buffer_info[i];
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   443
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   444
		cleaned = 1;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   445
		cleaned_count++;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   446
		pci_unmap_single(pdev,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   447
				 buffer_info->dma,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   448
				 adapter->rx_buffer_len,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   449
				 PCI_DMA_FROMDEVICE);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   450
		buffer_info->dma = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   451
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   452
		length = le16_to_cpu(rx_desc->length);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   453
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   454
		/*
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   455
		 * !EOP means multiple descriptors were used to store a single
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   456
		 * packet, if that's the case we need to toss it.  In fact, we
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   457
		 * need to toss every packet with the EOP bit clear and the
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   458
		 * next frame that _does_ have the EOP bit set, as it is by
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   459
		 * definition only a frame fragment
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   460
		 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   461
		if (unlikely(!(status & E1000_RXD_STAT_EOP)))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   462
			adapter->flags2 |= FLAG2_IS_DISCARDING;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   463
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   464
		if (adapter->flags2 & FLAG2_IS_DISCARDING) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   465
			/* All receives must fit into a single buffer */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   466
			e_dbg("Receive packet consumed multiple buffers\n");
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   467
			/* recycle */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   468
			buffer_info->skb = skb;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   469
			if (status & E1000_RXD_STAT_EOP)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   470
				adapter->flags2 &= ~FLAG2_IS_DISCARDING;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   471
			goto next_desc;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   472
		}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   473
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   474
		if (rx_desc->errors & E1000_RXD_ERR_FRAME_ERR_MASK) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   475
			/* recycle */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   476
			buffer_info->skb = skb;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   477
			goto next_desc;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   478
		}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   479
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   480
		/* adjust length to remove Ethernet CRC */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   481
		if (!(adapter->flags2 & FLAG2_CRC_STRIPPING))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   482
			length -= 4;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   483
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   484
		total_rx_bytes += length;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   485
		total_rx_packets++;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   486
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   487
		/*
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   488
		 * code added for copybreak, this should improve
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   489
		 * performance for small packets with large amounts
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   490
		 * of reassembly being done in the stack
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   491
		 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   492
		if (length < copybreak) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   493
			struct sk_buff *new_skb =
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   494
			    netdev_alloc_skb_ip_align(netdev, length);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   495
			if (new_skb) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   496
				skb_copy_to_linear_data_offset(new_skb,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   497
							       -NET_IP_ALIGN,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   498
							       (skb->data -
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   499
								NET_IP_ALIGN),
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   500
							       (length +
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   501
								NET_IP_ALIGN));
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   502
				/* save the skb in buffer_info as good */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   503
				buffer_info->skb = skb;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   504
				skb = new_skb;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   505
			}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   506
			/* else just continue with the old one */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   507
		}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   508
		/* end copybreak code */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   509
		skb_put(skb, length);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   510
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   511
		/* Receive Checksum Offload */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   512
		e1000_rx_checksum(adapter,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   513
				  (u32)(status) |
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   514
				  ((u32)(rx_desc->errors) << 24),
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   515
				  le16_to_cpu(rx_desc->csum), skb);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   516
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   517
		e1000_receive_skb(adapter, netdev, skb,status,rx_desc->special);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   518
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   519
next_desc:
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   520
		rx_desc->status = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   521
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   522
		/* return some buffers to hardware, one at a time is too slow */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   523
		if (cleaned_count >= E1000_RX_BUFFER_WRITE) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   524
			adapter->alloc_rx_buf(adapter, cleaned_count);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   525
			cleaned_count = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   526
		}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   527
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   528
		/* use prefetched values */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   529
		rx_desc = next_rxd;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   530
		buffer_info = next_buffer;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   531
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   532
	rx_ring->next_to_clean = i;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   533
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   534
	cleaned_count = e1000_desc_unused(rx_ring);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   535
	if (cleaned_count)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   536
		adapter->alloc_rx_buf(adapter, cleaned_count);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   537
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   538
	adapter->total_rx_bytes += total_rx_bytes;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   539
	adapter->total_rx_packets += total_rx_packets;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   540
	netdev->stats.rx_bytes += total_rx_bytes;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   541
	netdev->stats.rx_packets += total_rx_packets;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   542
	return cleaned;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   543
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   544
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   545
static void e1000_put_txbuf(struct e1000_adapter *adapter,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   546
			     struct e1000_buffer *buffer_info)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   547
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   548
	if (buffer_info->dma) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   549
		if (buffer_info->mapped_as_page)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   550
			pci_unmap_page(adapter->pdev, buffer_info->dma,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   551
				       buffer_info->length, PCI_DMA_TODEVICE);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   552
		else
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   553
			pci_unmap_single(adapter->pdev,	buffer_info->dma,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   554
					 buffer_info->length,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   555
					 PCI_DMA_TODEVICE);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   556
		buffer_info->dma = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   557
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   558
	if (buffer_info->skb) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   559
		dev_kfree_skb_any(buffer_info->skb);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   560
		buffer_info->skb = NULL;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   561
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   562
	buffer_info->time_stamp = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   563
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   564
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   565
static void e1000_print_hw_hang(struct work_struct *work)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   566
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   567
	struct e1000_adapter *adapter = container_of(work,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   568
	                                             struct e1000_adapter,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   569
	                                             print_hang_task);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   570
	struct e1000_ring *tx_ring = adapter->tx_ring;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   571
	unsigned int i = tx_ring->next_to_clean;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   572
	unsigned int eop = tx_ring->buffer_info[i].next_to_watch;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   573
	struct e1000_tx_desc *eop_desc = E1000_TX_DESC(*tx_ring, eop);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   574
	struct e1000_hw *hw = &adapter->hw;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   575
	u16 phy_status, phy_1000t_status, phy_ext_status;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   576
	u16 pci_status;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   577
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   578
	e1e_rphy(hw, PHY_STATUS, &phy_status);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   579
	e1e_rphy(hw, PHY_1000T_STATUS, &phy_1000t_status);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   580
	e1e_rphy(hw, PHY_EXT_STATUS, &phy_ext_status);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   581
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   582
	pci_read_config_word(adapter->pdev, PCI_STATUS, &pci_status);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   583
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   584
	/* detected Hardware unit hang */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   585
	e_err("Detected Hardware Unit Hang:\n"
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   586
	      "  TDH                  <%x>\n"
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   587
	      "  TDT                  <%x>\n"
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   588
	      "  next_to_use          <%x>\n"
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   589
	      "  next_to_clean        <%x>\n"
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   590
	      "buffer_info[next_to_clean]:\n"
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   591
	      "  time_stamp           <%lx>\n"
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   592
	      "  next_to_watch        <%x>\n"
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   593
	      "  jiffies              <%lx>\n"
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   594
	      "  next_to_watch.status <%x>\n"
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   595
	      "MAC Status             <%x>\n"
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   596
	      "PHY Status             <%x>\n"
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   597
	      "PHY 1000BASE-T Status  <%x>\n"
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   598
	      "PHY Extended Status    <%x>\n"
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   599
	      "PCI Status             <%x>\n",
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   600
	      readl(adapter->hw.hw_addr + tx_ring->head),
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   601
	      readl(adapter->hw.hw_addr + tx_ring->tail),
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   602
	      tx_ring->next_to_use,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   603
	      tx_ring->next_to_clean,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   604
	      tx_ring->buffer_info[eop].time_stamp,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   605
	      eop,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   606
	      jiffies,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   607
	      eop_desc->upper.fields.status,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   608
	      er32(STATUS),
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   609
	      phy_status,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   610
	      phy_1000t_status,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   611
	      phy_ext_status,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   612
	      pci_status);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   613
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   614
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   615
/**
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   616
 * e1000_clean_tx_irq - Reclaim resources after transmit completes
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   617
 * @adapter: board private structure
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   618
 *
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   619
 * the return value indicates whether actual cleaning was done, there
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   620
 * is no guarantee that everything was cleaned
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   621
 **/
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   622
static bool e1000_clean_tx_irq(struct e1000_adapter *adapter)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   623
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   624
	struct net_device *netdev = adapter->netdev;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   625
	struct e1000_hw *hw = &adapter->hw;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   626
	struct e1000_ring *tx_ring = adapter->tx_ring;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   627
	struct e1000_tx_desc *tx_desc, *eop_desc;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   628
	struct e1000_buffer *buffer_info;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   629
	unsigned int i, eop;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   630
	unsigned int count = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   631
	unsigned int total_tx_bytes = 0, total_tx_packets = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   632
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   633
	i = tx_ring->next_to_clean;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   634
	eop = tx_ring->buffer_info[i].next_to_watch;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   635
	eop_desc = E1000_TX_DESC(*tx_ring, eop);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   636
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   637
	while ((eop_desc->upper.data & cpu_to_le32(E1000_TXD_STAT_DD)) &&
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   638
	       (count < tx_ring->count)) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   639
		bool cleaned = false;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   640
		for (; !cleaned; count++) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   641
			tx_desc = E1000_TX_DESC(*tx_ring, i);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   642
			buffer_info = &tx_ring->buffer_info[i];
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   643
			cleaned = (i == eop);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   644
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   645
			if (cleaned) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   646
				struct sk_buff *skb = buffer_info->skb;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   647
				unsigned int segs, bytecount;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   648
				segs = skb_shinfo(skb)->gso_segs ?: 1;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   649
				/* multiply data chunks by size of headers */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   650
				bytecount = ((segs - 1) * skb_headlen(skb)) +
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   651
					    skb->len;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   652
				total_tx_packets += segs;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   653
				total_tx_bytes += bytecount;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   654
			}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   655
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   656
			e1000_put_txbuf(adapter, buffer_info);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   657
			tx_desc->upper.data = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   658
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   659
			i++;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   660
			if (i == tx_ring->count)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   661
				i = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   662
		}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   663
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   664
		if (i == tx_ring->next_to_use)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   665
			break;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   666
		eop = tx_ring->buffer_info[i].next_to_watch;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   667
		eop_desc = E1000_TX_DESC(*tx_ring, eop);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   668
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   669
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   670
	tx_ring->next_to_clean = i;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   671
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   672
#define TX_WAKE_THRESHOLD 32
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   673
	if (count && netif_carrier_ok(netdev) &&
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   674
	    e1000_desc_unused(tx_ring) >= TX_WAKE_THRESHOLD) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   675
		/* Make sure that anybody stopping the queue after this
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   676
		 * sees the new next_to_clean.
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   677
		 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   678
		smp_mb();
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   679
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   680
		if (netif_queue_stopped(netdev) &&
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   681
		    !(test_bit(__E1000_DOWN, &adapter->state))) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   682
			netif_wake_queue(netdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   683
			++adapter->restart_queue;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   684
		}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   685
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   686
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   687
	if (adapter->detect_tx_hung) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   688
		/*
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   689
		 * Detect a transmit hang in hardware, this serializes the
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   690
		 * check with the clearing of time_stamp and movement of i
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   691
		 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   692
		adapter->detect_tx_hung = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   693
		if (tx_ring->buffer_info[i].time_stamp &&
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   694
		    time_after(jiffies, tx_ring->buffer_info[i].time_stamp
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   695
			       + (adapter->tx_timeout_factor * HZ)) &&
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   696
		    !(er32(STATUS) & E1000_STATUS_TXOFF)) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   697
			schedule_work(&adapter->print_hang_task);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   698
			netif_stop_queue(netdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   699
		}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   700
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   701
	adapter->total_tx_bytes += total_tx_bytes;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   702
	adapter->total_tx_packets += total_tx_packets;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   703
	netdev->stats.tx_bytes += total_tx_bytes;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   704
	netdev->stats.tx_packets += total_tx_packets;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   705
	return (count < tx_ring->count);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   706
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   707
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   708
/**
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   709
 * e1000_clean_rx_irq_ps - Send received data up the network stack; packet split
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   710
 * @adapter: board private structure
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   711
 *
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   712
 * the return value indicates whether actual cleaning was done, there
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   713
 * is no guarantee that everything was cleaned
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   714
 **/
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   715
static bool e1000_clean_rx_irq_ps(struct e1000_adapter *adapter,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   716
				  int *work_done, int work_to_do)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   717
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   718
	struct e1000_hw *hw = &adapter->hw;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   719
	union e1000_rx_desc_packet_split *rx_desc, *next_rxd;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   720
	struct net_device *netdev = adapter->netdev;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   721
	struct pci_dev *pdev = adapter->pdev;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   722
	struct e1000_ring *rx_ring = adapter->rx_ring;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   723
	struct e1000_buffer *buffer_info, *next_buffer;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   724
	struct e1000_ps_page *ps_page;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   725
	struct sk_buff *skb;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   726
	unsigned int i, j;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   727
	u32 length, staterr;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   728
	int cleaned_count = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   729
	bool cleaned = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   730
	unsigned int total_rx_bytes = 0, total_rx_packets = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   731
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   732
	i = rx_ring->next_to_clean;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   733
	rx_desc = E1000_RX_DESC_PS(*rx_ring, i);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   734
	staterr = le32_to_cpu(rx_desc->wb.middle.status_error);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   735
	buffer_info = &rx_ring->buffer_info[i];
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   736
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   737
	while (staterr & E1000_RXD_STAT_DD) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   738
		if (*work_done >= work_to_do)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   739
			break;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   740
		(*work_done)++;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   741
		skb = buffer_info->skb;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   742
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   743
		/* in the packet split case this is header only */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   744
		prefetch(skb->data - NET_IP_ALIGN);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   745
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   746
		i++;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   747
		if (i == rx_ring->count)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   748
			i = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   749
		next_rxd = E1000_RX_DESC_PS(*rx_ring, i);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   750
		prefetch(next_rxd);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   751
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   752
		next_buffer = &rx_ring->buffer_info[i];
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   753
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   754
		cleaned = 1;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   755
		cleaned_count++;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   756
		pci_unmap_single(pdev, buffer_info->dma,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   757
				 adapter->rx_ps_bsize0,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   758
				 PCI_DMA_FROMDEVICE);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   759
		buffer_info->dma = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   760
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   761
		/* see !EOP comment in other rx routine */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   762
		if (!(staterr & E1000_RXD_STAT_EOP))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   763
			adapter->flags2 |= FLAG2_IS_DISCARDING;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   764
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   765
		if (adapter->flags2 & FLAG2_IS_DISCARDING) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   766
			e_dbg("Packet Split buffers didn't pick up the full "
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   767
			      "packet\n");
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   768
			dev_kfree_skb_irq(skb);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   769
			if (staterr & E1000_RXD_STAT_EOP)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   770
				adapter->flags2 &= ~FLAG2_IS_DISCARDING;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   771
			goto next_desc;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   772
		}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   773
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   774
		if (staterr & E1000_RXDEXT_ERR_FRAME_ERR_MASK) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   775
			dev_kfree_skb_irq(skb);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   776
			goto next_desc;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   777
		}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   778
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   779
		length = le16_to_cpu(rx_desc->wb.middle.length0);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   780
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   781
		if (!length) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   782
			e_dbg("Last part of the packet spanning multiple "
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   783
			      "descriptors\n");
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   784
			dev_kfree_skb_irq(skb);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   785
			goto next_desc;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   786
		}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   787
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   788
		/* Good Receive */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   789
		skb_put(skb, length);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   790
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   791
		{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   792
		/*
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   793
		 * this looks ugly, but it seems compiler issues make it
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   794
		 * more efficient than reusing j
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   795
		 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   796
		int l1 = le16_to_cpu(rx_desc->wb.upper.length[0]);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   797
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   798
		/*
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   799
		 * page alloc/put takes too long and effects small packet
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   800
		 * throughput, so unsplit small packets and save the alloc/put
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   801
		 * only valid in softirq (napi) context to call kmap_*
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   802
		 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   803
		if (l1 && (l1 <= copybreak) &&
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   804
		    ((length + l1) <= adapter->rx_ps_bsize0)) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   805
			u8 *vaddr;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   806
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   807
			ps_page = &buffer_info->ps_pages[0];
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   808
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   809
			/*
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   810
			 * there is no documentation about how to call
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   811
			 * kmap_atomic, so we can't hold the mapping
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   812
			 * very long
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   813
			 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   814
			pci_dma_sync_single_for_cpu(pdev, ps_page->dma,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   815
				PAGE_SIZE, PCI_DMA_FROMDEVICE);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   816
			vaddr = kmap_atomic(ps_page->page, KM_SKB_DATA_SOFTIRQ);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   817
			memcpy(skb_tail_pointer(skb), vaddr, l1);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   818
			kunmap_atomic(vaddr, KM_SKB_DATA_SOFTIRQ);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   819
			pci_dma_sync_single_for_device(pdev, ps_page->dma,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   820
				PAGE_SIZE, PCI_DMA_FROMDEVICE);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   821
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   822
			/* remove the CRC */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   823
			if (!(adapter->flags2 & FLAG2_CRC_STRIPPING))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   824
				l1 -= 4;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   825
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   826
			skb_put(skb, l1);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   827
			goto copydone;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   828
		} /* if */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   829
		}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   830
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   831
		for (j = 0; j < PS_PAGE_BUFFERS; j++) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   832
			length = le16_to_cpu(rx_desc->wb.upper.length[j]);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   833
			if (!length)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   834
				break;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   835
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   836
			ps_page = &buffer_info->ps_pages[j];
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   837
			pci_unmap_page(pdev, ps_page->dma, PAGE_SIZE,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   838
				       PCI_DMA_FROMDEVICE);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   839
			ps_page->dma = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   840
			skb_fill_page_desc(skb, j, ps_page->page, 0, length);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   841
			ps_page->page = NULL;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   842
			skb->len += length;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   843
			skb->data_len += length;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   844
			skb->truesize += length;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   845
		}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   846
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   847
		/* strip the ethernet crc, problem is we're using pages now so
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   848
		 * this whole operation can get a little cpu intensive
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   849
		 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   850
		if (!(adapter->flags2 & FLAG2_CRC_STRIPPING))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   851
			pskb_trim(skb, skb->len - 4);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   852
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   853
copydone:
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   854
		total_rx_bytes += skb->len;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   855
		total_rx_packets++;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   856
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   857
		e1000_rx_checksum(adapter, staterr, le16_to_cpu(
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   858
			rx_desc->wb.lower.hi_dword.csum_ip.csum), skb);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   859
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   860
		if (rx_desc->wb.upper.header_status &
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   861
			   cpu_to_le16(E1000_RXDPS_HDRSTAT_HDRSP))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   862
			adapter->rx_hdr_split++;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   863
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   864
		e1000_receive_skb(adapter, netdev, skb,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   865
				  staterr, rx_desc->wb.middle.vlan);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   866
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   867
next_desc:
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   868
		rx_desc->wb.middle.status_error &= cpu_to_le32(~0xFF);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   869
		buffer_info->skb = NULL;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   870
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   871
		/* return some buffers to hardware, one at a time is too slow */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   872
		if (cleaned_count >= E1000_RX_BUFFER_WRITE) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   873
			adapter->alloc_rx_buf(adapter, cleaned_count);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   874
			cleaned_count = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   875
		}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   876
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   877
		/* use prefetched values */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   878
		rx_desc = next_rxd;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   879
		buffer_info = next_buffer;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   880
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   881
		staterr = le32_to_cpu(rx_desc->wb.middle.status_error);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   882
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   883
	rx_ring->next_to_clean = i;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   884
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   885
	cleaned_count = e1000_desc_unused(rx_ring);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   886
	if (cleaned_count)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   887
		adapter->alloc_rx_buf(adapter, cleaned_count);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   888
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   889
	adapter->total_rx_bytes += total_rx_bytes;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   890
	adapter->total_rx_packets += total_rx_packets;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   891
	netdev->stats.rx_bytes += total_rx_bytes;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   892
	netdev->stats.rx_packets += total_rx_packets;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   893
	return cleaned;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   894
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   895
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   896
/**
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   897
 * e1000_consume_page - helper function
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   898
 **/
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   899
static void e1000_consume_page(struct e1000_buffer *bi, struct sk_buff *skb,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   900
                               u16 length)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   901
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   902
	bi->page = NULL;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   903
	skb->len += length;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   904
	skb->data_len += length;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   905
	skb->truesize += length;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   906
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   907
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   908
/**
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   909
 * e1000_clean_jumbo_rx_irq - Send received data up the network stack; legacy
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   910
 * @adapter: board private structure
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   911
 *
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   912
 * the return value indicates whether actual cleaning was done, there
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   913
 * is no guarantee that everything was cleaned
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   914
 **/
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   915
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   916
static bool e1000_clean_jumbo_rx_irq(struct e1000_adapter *adapter,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   917
                                     int *work_done, int work_to_do)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   918
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   919
	struct net_device *netdev = adapter->netdev;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   920
	struct pci_dev *pdev = adapter->pdev;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   921
	struct e1000_ring *rx_ring = adapter->rx_ring;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   922
	struct e1000_rx_desc *rx_desc, *next_rxd;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   923
	struct e1000_buffer *buffer_info, *next_buffer;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   924
	u32 length;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   925
	unsigned int i;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   926
	int cleaned_count = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   927
	bool cleaned = false;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   928
	unsigned int total_rx_bytes=0, total_rx_packets=0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   929
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   930
	i = rx_ring->next_to_clean;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   931
	rx_desc = E1000_RX_DESC(*rx_ring, i);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   932
	buffer_info = &rx_ring->buffer_info[i];
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   933
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   934
	while (rx_desc->status & E1000_RXD_STAT_DD) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   935
		struct sk_buff *skb;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   936
		u8 status;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   937
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   938
		if (*work_done >= work_to_do)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   939
			break;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   940
		(*work_done)++;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   941
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   942
		status = rx_desc->status;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   943
		skb = buffer_info->skb;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   944
		buffer_info->skb = NULL;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   945
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   946
		++i;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   947
		if (i == rx_ring->count)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   948
			i = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   949
		next_rxd = E1000_RX_DESC(*rx_ring, i);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   950
		prefetch(next_rxd);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   951
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   952
		next_buffer = &rx_ring->buffer_info[i];
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   953
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   954
		cleaned = true;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   955
		cleaned_count++;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   956
		pci_unmap_page(pdev, buffer_info->dma, PAGE_SIZE,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   957
		               PCI_DMA_FROMDEVICE);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   958
		buffer_info->dma = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   959
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   960
		length = le16_to_cpu(rx_desc->length);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   961
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   962
		/* errors is only valid for DD + EOP descriptors */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   963
		if (unlikely((status & E1000_RXD_STAT_EOP) &&
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   964
		    (rx_desc->errors & E1000_RXD_ERR_FRAME_ERR_MASK))) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   965
				/* recycle both page and skb */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   966
				buffer_info->skb = skb;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   967
				/* an error means any chain goes out the window
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   968
				 * too */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   969
				if (rx_ring->rx_skb_top)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   970
					dev_kfree_skb(rx_ring->rx_skb_top);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   971
				rx_ring->rx_skb_top = NULL;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   972
				goto next_desc;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   973
		}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   974
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   975
#define rxtop rx_ring->rx_skb_top
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   976
		if (!(status & E1000_RXD_STAT_EOP)) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   977
			/* this descriptor is only the beginning (or middle) */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   978
			if (!rxtop) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   979
				/* this is the beginning of a chain */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   980
				rxtop = skb;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   981
				skb_fill_page_desc(rxtop, 0, buffer_info->page,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   982
				                   0, length);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   983
			} else {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   984
				/* this is the middle of a chain */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   985
				skb_fill_page_desc(rxtop,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   986
				    skb_shinfo(rxtop)->nr_frags,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   987
				    buffer_info->page, 0, length);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   988
				/* re-use the skb, only consumed the page */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   989
				buffer_info->skb = skb;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   990
			}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   991
			e1000_consume_page(buffer_info, rxtop, length);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   992
			goto next_desc;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   993
		} else {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   994
			if (rxtop) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   995
				/* end of the chain */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   996
				skb_fill_page_desc(rxtop,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   997
				    skb_shinfo(rxtop)->nr_frags,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   998
				    buffer_info->page, 0, length);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   999
				/* re-use the current skb, we only consumed the
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1000
				 * page */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1001
				buffer_info->skb = skb;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1002
				skb = rxtop;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1003
				rxtop = NULL;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1004
				e1000_consume_page(buffer_info, skb, length);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1005
			} else {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1006
				/* no chain, got EOP, this buf is the packet
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1007
				 * copybreak to save the put_page/alloc_page */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1008
				if (length <= copybreak &&
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1009
				    skb_tailroom(skb) >= length) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1010
					u8 *vaddr;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1011
					vaddr = kmap_atomic(buffer_info->page,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1012
					                   KM_SKB_DATA_SOFTIRQ);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1013
					memcpy(skb_tail_pointer(skb), vaddr,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1014
					       length);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1015
					kunmap_atomic(vaddr,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1016
					              KM_SKB_DATA_SOFTIRQ);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1017
					/* re-use the page, so don't erase
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1018
					 * buffer_info->page */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1019
					skb_put(skb, length);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1020
				} else {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1021
					skb_fill_page_desc(skb, 0,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1022
					                   buffer_info->page, 0,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1023
				                           length);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1024
					e1000_consume_page(buffer_info, skb,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1025
					                   length);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1026
				}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1027
			}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1028
		}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1029
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1030
		/* Receive Checksum Offload XXX recompute due to CRC strip? */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1031
		e1000_rx_checksum(adapter,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1032
		                  (u32)(status) |
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1033
		                  ((u32)(rx_desc->errors) << 24),
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1034
		                  le16_to_cpu(rx_desc->csum), skb);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1035
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1036
		/* probably a little skewed due to removing CRC */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1037
		total_rx_bytes += skb->len;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1038
		total_rx_packets++;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1039
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1040
		/* eth type trans needs skb->data to point to something */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1041
		if (!pskb_may_pull(skb, ETH_HLEN)) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1042
			e_err("pskb_may_pull failed.\n");
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1043
			dev_kfree_skb(skb);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1044
			goto next_desc;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1045
		}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1046
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1047
		e1000_receive_skb(adapter, netdev, skb, status,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1048
		                  rx_desc->special);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1049
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1050
next_desc:
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1051
		rx_desc->status = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1052
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1053
		/* return some buffers to hardware, one at a time is too slow */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1054
		if (unlikely(cleaned_count >= E1000_RX_BUFFER_WRITE)) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1055
			adapter->alloc_rx_buf(adapter, cleaned_count);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1056
			cleaned_count = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1057
		}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1058
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1059
		/* use prefetched values */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1060
		rx_desc = next_rxd;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1061
		buffer_info = next_buffer;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1062
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1063
	rx_ring->next_to_clean = i;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1064
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1065
	cleaned_count = e1000_desc_unused(rx_ring);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1066
	if (cleaned_count)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1067
		adapter->alloc_rx_buf(adapter, cleaned_count);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1068
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1069
	adapter->total_rx_bytes += total_rx_bytes;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1070
	adapter->total_rx_packets += total_rx_packets;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1071
	netdev->stats.rx_bytes += total_rx_bytes;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1072
	netdev->stats.rx_packets += total_rx_packets;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1073
	return cleaned;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1074
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1075
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1076
/**
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1077
 * e1000_clean_rx_ring - Free Rx Buffers per Queue
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1078
 * @adapter: board private structure
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1079
 **/
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1080
static void e1000_clean_rx_ring(struct e1000_adapter *adapter)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1081
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1082
	struct e1000_ring *rx_ring = adapter->rx_ring;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1083
	struct e1000_buffer *buffer_info;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1084
	struct e1000_ps_page *ps_page;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1085
	struct pci_dev *pdev = adapter->pdev;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1086
	unsigned int i, j;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1087
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1088
	/* Free all the Rx ring sk_buffs */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1089
	for (i = 0; i < rx_ring->count; i++) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1090
		buffer_info = &rx_ring->buffer_info[i];
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1091
		if (buffer_info->dma) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1092
			if (adapter->clean_rx == e1000_clean_rx_irq)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1093
				pci_unmap_single(pdev, buffer_info->dma,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1094
						 adapter->rx_buffer_len,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1095
						 PCI_DMA_FROMDEVICE);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1096
			else if (adapter->clean_rx == e1000_clean_jumbo_rx_irq)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1097
				pci_unmap_page(pdev, buffer_info->dma,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1098
				               PAGE_SIZE,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1099
				               PCI_DMA_FROMDEVICE);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1100
			else if (adapter->clean_rx == e1000_clean_rx_irq_ps)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1101
				pci_unmap_single(pdev, buffer_info->dma,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1102
						 adapter->rx_ps_bsize0,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1103
						 PCI_DMA_FROMDEVICE);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1104
			buffer_info->dma = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1105
		}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1106
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1107
		if (buffer_info->page) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1108
			put_page(buffer_info->page);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1109
			buffer_info->page = NULL;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1110
		}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1111
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1112
		if (buffer_info->skb) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1113
			dev_kfree_skb(buffer_info->skb);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1114
			buffer_info->skb = NULL;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1115
		}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1116
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1117
		for (j = 0; j < PS_PAGE_BUFFERS; j++) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1118
			ps_page = &buffer_info->ps_pages[j];
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1119
			if (!ps_page->page)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1120
				break;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1121
			pci_unmap_page(pdev, ps_page->dma, PAGE_SIZE,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1122
				       PCI_DMA_FROMDEVICE);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1123
			ps_page->dma = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1124
			put_page(ps_page->page);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1125
			ps_page->page = NULL;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1126
		}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1127
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1128
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1129
	/* there also may be some cached data from a chained receive */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1130
	if (rx_ring->rx_skb_top) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1131
		dev_kfree_skb(rx_ring->rx_skb_top);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1132
		rx_ring->rx_skb_top = NULL;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1133
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1134
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1135
	/* Zero out the descriptor ring */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1136
	memset(rx_ring->desc, 0, rx_ring->size);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1137
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1138
	rx_ring->next_to_clean = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1139
	rx_ring->next_to_use = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1140
	adapter->flags2 &= ~FLAG2_IS_DISCARDING;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1141
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1142
	writel(0, adapter->hw.hw_addr + rx_ring->head);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1143
	writel(0, adapter->hw.hw_addr + rx_ring->tail);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1144
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1145
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1146
static void e1000e_downshift_workaround(struct work_struct *work)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1147
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1148
	struct e1000_adapter *adapter = container_of(work,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1149
					struct e1000_adapter, downshift_task);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1150
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1151
	e1000e_gig_downshift_workaround_ich8lan(&adapter->hw);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1152
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1153
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1154
/**
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1155
 * e1000_intr_msi - Interrupt Handler
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1156
 * @irq: interrupt number
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1157
 * @data: pointer to a network interface device structure
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1158
 **/
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1159
static irqreturn_t e1000_intr_msi(int irq, void *data)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1160
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1161
	struct net_device *netdev = data;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1162
	struct e1000_adapter *adapter = netdev_priv(netdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1163
	struct e1000_hw *hw = &adapter->hw;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1164
	u32 icr = er32(ICR);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1165
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1166
	/*
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1167
	 * read ICR disables interrupts using IAM
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1168
	 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1169
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1170
	if (icr & E1000_ICR_LSC) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1171
		hw->mac.get_link_status = 1;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1172
		/*
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1173
		 * ICH8 workaround-- Call gig speed drop workaround on cable
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1174
		 * disconnect (LSC) before accessing any PHY registers
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1175
		 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1176
		if ((adapter->flags & FLAG_LSC_GIG_SPEED_DROP) &&
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1177
		    (!(er32(STATUS) & E1000_STATUS_LU)))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1178
			schedule_work(&adapter->downshift_task);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1179
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1180
		/*
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1181
		 * 80003ES2LAN workaround-- For packet buffer work-around on
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1182
		 * link down event; disable receives here in the ISR and reset
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1183
		 * adapter in watchdog
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1184
		 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1185
		if (netif_carrier_ok(netdev) &&
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1186
		    adapter->flags & FLAG_RX_NEEDS_RESTART) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1187
			/* disable receives */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1188
			u32 rctl = er32(RCTL);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1189
			ew32(RCTL, rctl & ~E1000_RCTL_EN);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1190
			adapter->flags |= FLAG_RX_RESTART_NOW;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1191
		}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1192
		/* guard against interrupt when we're going down */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1193
		if (!test_bit(__E1000_DOWN, &adapter->state))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1194
			mod_timer(&adapter->watchdog_timer, jiffies + 1);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1195
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1196
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1197
	if (napi_schedule_prep(&adapter->napi)) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1198
		adapter->total_tx_bytes = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1199
		adapter->total_tx_packets = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1200
		adapter->total_rx_bytes = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1201
		adapter->total_rx_packets = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1202
		__napi_schedule(&adapter->napi);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1203
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1204
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1205
	return IRQ_HANDLED;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1206
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1207
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1208
/**
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1209
 * e1000_intr - Interrupt Handler
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1210
 * @irq: interrupt number
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1211
 * @data: pointer to a network interface device structure
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1212
 **/
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1213
static irqreturn_t e1000_intr(int irq, void *data)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1214
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1215
	struct net_device *netdev = data;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1216
	struct e1000_adapter *adapter = netdev_priv(netdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1217
	struct e1000_hw *hw = &adapter->hw;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1218
	u32 rctl, icr = er32(ICR);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1219
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1220
	if (!icr || test_bit(__E1000_DOWN, &adapter->state))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1221
		return IRQ_NONE;  /* Not our interrupt */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1222
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1223
	/*
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1224
	 * IMS will not auto-mask if INT_ASSERTED is not set, and if it is
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1225
	 * not set, then the adapter didn't send an interrupt
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1226
	 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1227
	if (!(icr & E1000_ICR_INT_ASSERTED))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1228
		return IRQ_NONE;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1229
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1230
	/*
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1231
	 * Interrupt Auto-Mask...upon reading ICR,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1232
	 * interrupts are masked.  No need for the
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1233
	 * IMC write
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1234
	 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1235
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1236
	if (icr & E1000_ICR_LSC) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1237
		hw->mac.get_link_status = 1;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1238
		/*
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1239
		 * ICH8 workaround-- Call gig speed drop workaround on cable
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1240
		 * disconnect (LSC) before accessing any PHY registers
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1241
		 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1242
		if ((adapter->flags & FLAG_LSC_GIG_SPEED_DROP) &&
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1243
		    (!(er32(STATUS) & E1000_STATUS_LU)))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1244
			schedule_work(&adapter->downshift_task);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1245
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1246
		/*
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1247
		 * 80003ES2LAN workaround--
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1248
		 * For packet buffer work-around on link down event;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1249
		 * disable receives here in the ISR and
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1250
		 * reset adapter in watchdog
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1251
		 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1252
		if (netif_carrier_ok(netdev) &&
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1253
		    (adapter->flags & FLAG_RX_NEEDS_RESTART)) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1254
			/* disable receives */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1255
			rctl = er32(RCTL);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1256
			ew32(RCTL, rctl & ~E1000_RCTL_EN);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1257
			adapter->flags |= FLAG_RX_RESTART_NOW;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1258
		}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1259
		/* guard against interrupt when we're going down */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1260
		if (!test_bit(__E1000_DOWN, &adapter->state))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1261
			mod_timer(&adapter->watchdog_timer, jiffies + 1);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1262
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1263
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1264
	if (napi_schedule_prep(&adapter->napi)) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1265
		adapter->total_tx_bytes = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1266
		adapter->total_tx_packets = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1267
		adapter->total_rx_bytes = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1268
		adapter->total_rx_packets = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1269
		__napi_schedule(&adapter->napi);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1270
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1271
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1272
	return IRQ_HANDLED;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1273
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1274
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1275
static irqreturn_t e1000_msix_other(int irq, void *data)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1276
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1277
	struct net_device *netdev = data;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1278
	struct e1000_adapter *adapter = netdev_priv(netdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1279
	struct e1000_hw *hw = &adapter->hw;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1280
	u32 icr = er32(ICR);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1281
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1282
	if (!(icr & E1000_ICR_INT_ASSERTED)) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1283
		if (!test_bit(__E1000_DOWN, &adapter->state))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1284
			ew32(IMS, E1000_IMS_OTHER);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1285
		return IRQ_NONE;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1286
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1287
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1288
	if (icr & adapter->eiac_mask)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1289
		ew32(ICS, (icr & adapter->eiac_mask));
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1290
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1291
	if (icr & E1000_ICR_OTHER) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1292
		if (!(icr & E1000_ICR_LSC))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1293
			goto no_link_interrupt;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1294
		hw->mac.get_link_status = 1;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1295
		/* guard against interrupt when we're going down */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1296
		if (!test_bit(__E1000_DOWN, &adapter->state))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1297
			mod_timer(&adapter->watchdog_timer, jiffies + 1);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1298
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1299
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1300
no_link_interrupt:
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1301
	if (!test_bit(__E1000_DOWN, &adapter->state))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1302
		ew32(IMS, E1000_IMS_LSC | E1000_IMS_OTHER);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1303
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1304
	return IRQ_HANDLED;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1305
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1306
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1307
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1308
static irqreturn_t e1000_intr_msix_tx(int irq, void *data)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1309
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1310
	struct net_device *netdev = data;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1311
	struct e1000_adapter *adapter = netdev_priv(netdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1312
	struct e1000_hw *hw = &adapter->hw;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1313
	struct e1000_ring *tx_ring = adapter->tx_ring;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1314
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1315
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1316
	adapter->total_tx_bytes = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1317
	adapter->total_tx_packets = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1318
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1319
	if (!e1000_clean_tx_irq(adapter))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1320
		/* Ring was not completely cleaned, so fire another interrupt */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1321
		ew32(ICS, tx_ring->ims_val);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1322
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1323
	return IRQ_HANDLED;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1324
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1325
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1326
static irqreturn_t e1000_intr_msix_rx(int irq, void *data)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1327
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1328
	struct net_device *netdev = data;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1329
	struct e1000_adapter *adapter = netdev_priv(netdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1330
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1331
	/* Write the ITR value calculated at the end of the
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1332
	 * previous interrupt.
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1333
	 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1334
	if (adapter->rx_ring->set_itr) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1335
		writel(1000000000 / (adapter->rx_ring->itr_val * 256),
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1336
		       adapter->hw.hw_addr + adapter->rx_ring->itr_register);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1337
		adapter->rx_ring->set_itr = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1338
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1339
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1340
	if (napi_schedule_prep(&adapter->napi)) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1341
		adapter->total_rx_bytes = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1342
		adapter->total_rx_packets = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1343
		__napi_schedule(&adapter->napi);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1344
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1345
	return IRQ_HANDLED;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1346
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1347
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1348
/**
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1349
 * e1000_configure_msix - Configure MSI-X hardware
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1350
 *
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1351
 * e1000_configure_msix sets up the hardware to properly
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1352
 * generate MSI-X interrupts.
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1353
 **/
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1354
static void e1000_configure_msix(struct e1000_adapter *adapter)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1355
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1356
	struct e1000_hw *hw = &adapter->hw;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1357
	struct e1000_ring *rx_ring = adapter->rx_ring;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1358
	struct e1000_ring *tx_ring = adapter->tx_ring;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1359
	int vector = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1360
	u32 ctrl_ext, ivar = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1361
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1362
	adapter->eiac_mask = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1363
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1364
	/* Workaround issue with spurious interrupts on 82574 in MSI-X mode */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1365
	if (hw->mac.type == e1000_82574) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1366
		u32 rfctl = er32(RFCTL);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1367
		rfctl |= E1000_RFCTL_ACK_DIS;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1368
		ew32(RFCTL, rfctl);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1369
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1370
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1371
#define E1000_IVAR_INT_ALLOC_VALID	0x8
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1372
	/* Configure Rx vector */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1373
	rx_ring->ims_val = E1000_IMS_RXQ0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1374
	adapter->eiac_mask |= rx_ring->ims_val;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1375
	if (rx_ring->itr_val)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1376
		writel(1000000000 / (rx_ring->itr_val * 256),
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1377
		       hw->hw_addr + rx_ring->itr_register);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1378
	else
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1379
		writel(1, hw->hw_addr + rx_ring->itr_register);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1380
	ivar = E1000_IVAR_INT_ALLOC_VALID | vector;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1381
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1382
	/* Configure Tx vector */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1383
	tx_ring->ims_val = E1000_IMS_TXQ0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1384
	vector++;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1385
	if (tx_ring->itr_val)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1386
		writel(1000000000 / (tx_ring->itr_val * 256),
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1387
		       hw->hw_addr + tx_ring->itr_register);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1388
	else
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1389
		writel(1, hw->hw_addr + tx_ring->itr_register);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1390
	adapter->eiac_mask |= tx_ring->ims_val;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1391
	ivar |= ((E1000_IVAR_INT_ALLOC_VALID | vector) << 8);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1392
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1393
	/* set vector for Other Causes, e.g. link changes */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1394
	vector++;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1395
	ivar |= ((E1000_IVAR_INT_ALLOC_VALID | vector) << 16);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1396
	if (rx_ring->itr_val)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1397
		writel(1000000000 / (rx_ring->itr_val * 256),
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1398
		       hw->hw_addr + E1000_EITR_82574(vector));
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1399
	else
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1400
		writel(1, hw->hw_addr + E1000_EITR_82574(vector));
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1401
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1402
	/* Cause Tx interrupts on every write back */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1403
	ivar |= (1 << 31);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1404
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1405
	ew32(IVAR, ivar);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1406
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1407
	/* enable MSI-X PBA support */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1408
	ctrl_ext = er32(CTRL_EXT);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1409
	ctrl_ext |= E1000_CTRL_EXT_PBA_CLR;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1410
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1411
	/* Auto-Mask Other interrupts upon ICR read */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1412
#define E1000_EIAC_MASK_82574   0x01F00000
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1413
	ew32(IAM, ~E1000_EIAC_MASK_82574 | E1000_IMS_OTHER);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1414
	ctrl_ext |= E1000_CTRL_EXT_EIAME;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1415
	ew32(CTRL_EXT, ctrl_ext);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1416
	e1e_flush();
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1417
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1418
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1419
void e1000e_reset_interrupt_capability(struct e1000_adapter *adapter)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1420
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1421
	if (adapter->msix_entries) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1422
		pci_disable_msix(adapter->pdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1423
		kfree(adapter->msix_entries);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1424
		adapter->msix_entries = NULL;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1425
	} else if (adapter->flags & FLAG_MSI_ENABLED) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1426
		pci_disable_msi(adapter->pdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1427
		adapter->flags &= ~FLAG_MSI_ENABLED;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1428
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1429
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1430
	return;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1431
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1432
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1433
/**
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1434
 * e1000e_set_interrupt_capability - set MSI or MSI-X if supported
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1435
 *
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1436
 * Attempt to configure interrupts using the best available
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1437
 * capabilities of the hardware and kernel.
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1438
 **/
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1439
void e1000e_set_interrupt_capability(struct e1000_adapter *adapter)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1440
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1441
	int err;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1442
	int numvecs, i;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1443
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1444
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1445
	switch (adapter->int_mode) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1446
	case E1000E_INT_MODE_MSIX:
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1447
		if (adapter->flags & FLAG_HAS_MSIX) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1448
			numvecs = 3; /* RxQ0, TxQ0 and other */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1449
			adapter->msix_entries = kcalloc(numvecs,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1450
						      sizeof(struct msix_entry),
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1451
						      GFP_KERNEL);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1452
			if (adapter->msix_entries) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1453
				for (i = 0; i < numvecs; i++)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1454
					adapter->msix_entries[i].entry = i;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1455
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1456
				err = pci_enable_msix(adapter->pdev,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1457
						      adapter->msix_entries,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1458
						      numvecs);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1459
				if (err == 0)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1460
					return;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1461
			}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1462
			/* MSI-X failed, so fall through and try MSI */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1463
			e_err("Failed to initialize MSI-X interrupts.  "
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1464
			      "Falling back to MSI interrupts.\n");
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1465
			e1000e_reset_interrupt_capability(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1466
		}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1467
		adapter->int_mode = E1000E_INT_MODE_MSI;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1468
		/* Fall through */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1469
	case E1000E_INT_MODE_MSI:
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1470
		if (!pci_enable_msi(adapter->pdev)) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1471
			adapter->flags |= FLAG_MSI_ENABLED;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1472
		} else {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1473
			adapter->int_mode = E1000E_INT_MODE_LEGACY;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1474
			e_err("Failed to initialize MSI interrupts.  Falling "
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1475
			      "back to legacy interrupts.\n");
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1476
		}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1477
		/* Fall through */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1478
	case E1000E_INT_MODE_LEGACY:
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1479
		/* Don't do anything; this is the system default */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1480
		break;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1481
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1482
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1483
	return;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1484
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1485
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1486
/**
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1487
 * e1000_request_msix - Initialize MSI-X interrupts
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1488
 *
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1489
 * e1000_request_msix allocates MSI-X vectors and requests interrupts from the
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1490
 * kernel.
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1491
 **/
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1492
static int e1000_request_msix(struct e1000_adapter *adapter)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1493
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1494
	struct net_device *netdev = adapter->netdev;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1495
	int err = 0, vector = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1496
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1497
	if (strlen(netdev->name) < (IFNAMSIZ - 5))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1498
		sprintf(adapter->rx_ring->name, "%s-rx-0", netdev->name);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1499
	else
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1500
		memcpy(adapter->rx_ring->name, netdev->name, IFNAMSIZ);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1501
	err = request_irq(adapter->msix_entries[vector].vector,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1502
			  e1000_intr_msix_rx, 0, adapter->rx_ring->name,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1503
			  netdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1504
	if (err)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1505
		goto out;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1506
	adapter->rx_ring->itr_register = E1000_EITR_82574(vector);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1507
	adapter->rx_ring->itr_val = adapter->itr;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1508
	vector++;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1509
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1510
	if (strlen(netdev->name) < (IFNAMSIZ - 5))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1511
		sprintf(adapter->tx_ring->name, "%s-tx-0", netdev->name);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1512
	else
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1513
		memcpy(adapter->tx_ring->name, netdev->name, IFNAMSIZ);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1514
	err = request_irq(adapter->msix_entries[vector].vector,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1515
			  e1000_intr_msix_tx, 0, adapter->tx_ring->name,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1516
			  netdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1517
	if (err)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1518
		goto out;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1519
	adapter->tx_ring->itr_register = E1000_EITR_82574(vector);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1520
	adapter->tx_ring->itr_val = adapter->itr;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1521
	vector++;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1522
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1523
	err = request_irq(adapter->msix_entries[vector].vector,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1524
			  e1000_msix_other, 0, netdev->name, netdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1525
	if (err)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1526
		goto out;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1527
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1528
	e1000_configure_msix(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1529
	return 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1530
out:
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1531
	return err;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1532
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1533
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1534
/**
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1535
 * e1000_request_irq - initialize interrupts
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1536
 *
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1537
 * Attempts to configure interrupts using the best available
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1538
 * capabilities of the hardware and kernel.
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1539
 **/
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1540
static int e1000_request_irq(struct e1000_adapter *adapter)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1541
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1542
	struct net_device *netdev = adapter->netdev;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1543
	int err;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1544
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1545
	if (adapter->msix_entries) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1546
		err = e1000_request_msix(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1547
		if (!err)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1548
			return err;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1549
		/* fall back to MSI */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1550
		e1000e_reset_interrupt_capability(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1551
		adapter->int_mode = E1000E_INT_MODE_MSI;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1552
		e1000e_set_interrupt_capability(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1553
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1554
	if (adapter->flags & FLAG_MSI_ENABLED) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1555
		err = request_irq(adapter->pdev->irq, e1000_intr_msi, 0,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1556
				  netdev->name, netdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1557
		if (!err)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1558
			return err;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1559
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1560
		/* fall back to legacy interrupt */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1561
		e1000e_reset_interrupt_capability(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1562
		adapter->int_mode = E1000E_INT_MODE_LEGACY;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1563
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1564
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1565
	err = request_irq(adapter->pdev->irq, e1000_intr, IRQF_SHARED,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1566
			  netdev->name, netdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1567
	if (err)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1568
		e_err("Unable to allocate interrupt, Error: %d\n", err);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1569
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1570
	return err;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1571
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1572
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1573
static void e1000_free_irq(struct e1000_adapter *adapter)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1574
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1575
	struct net_device *netdev = adapter->netdev;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1576
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1577
	if (adapter->msix_entries) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1578
		int vector = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1579
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1580
		free_irq(adapter->msix_entries[vector].vector, netdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1581
		vector++;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1582
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1583
		free_irq(adapter->msix_entries[vector].vector, netdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1584
		vector++;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1585
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1586
		/* Other Causes interrupt vector */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1587
		free_irq(adapter->msix_entries[vector].vector, netdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1588
		return;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1589
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1590
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1591
	free_irq(adapter->pdev->irq, netdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1592
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1593
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1594
/**
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1595
 * e1000_irq_disable - Mask off interrupt generation on the NIC
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1596
 **/
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1597
static void e1000_irq_disable(struct e1000_adapter *adapter)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1598
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1599
	struct e1000_hw *hw = &adapter->hw;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1600
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1601
	ew32(IMC, ~0);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1602
	if (adapter->msix_entries)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1603
		ew32(EIAC_82574, 0);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1604
	e1e_flush();
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1605
	synchronize_irq(adapter->pdev->irq);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1606
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1607
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1608
/**
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1609
 * e1000_irq_enable - Enable default interrupt generation settings
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1610
 **/
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1611
static void e1000_irq_enable(struct e1000_adapter *adapter)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1612
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1613
	struct e1000_hw *hw = &adapter->hw;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1614
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1615
	if (adapter->msix_entries) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1616
		ew32(EIAC_82574, adapter->eiac_mask & E1000_EIAC_MASK_82574);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1617
		ew32(IMS, adapter->eiac_mask | E1000_IMS_OTHER | E1000_IMS_LSC);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1618
	} else {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1619
		ew32(IMS, IMS_ENABLE_MASK);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1620
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1621
	e1e_flush();
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1622
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1623
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1624
/**
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1625
 * e1000_get_hw_control - get control of the h/w from f/w
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1626
 * @adapter: address of board private structure
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1627
 *
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1628
 * e1000_get_hw_control sets {CTRL_EXT|SWSM}:DRV_LOAD bit.
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1629
 * For ASF and Pass Through versions of f/w this means that
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1630
 * the driver is loaded. For AMT version (only with 82573)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1631
 * of the f/w this means that the network i/f is open.
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1632
 **/
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1633
static void e1000_get_hw_control(struct e1000_adapter *adapter)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1634
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1635
	struct e1000_hw *hw = &adapter->hw;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1636
	u32 ctrl_ext;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1637
	u32 swsm;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1638
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1639
	/* Let firmware know the driver has taken over */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1640
	if (adapter->flags & FLAG_HAS_SWSM_ON_LOAD) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1641
		swsm = er32(SWSM);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1642
		ew32(SWSM, swsm | E1000_SWSM_DRV_LOAD);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1643
	} else if (adapter->flags & FLAG_HAS_CTRLEXT_ON_LOAD) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1644
		ctrl_ext = er32(CTRL_EXT);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1645
		ew32(CTRL_EXT, ctrl_ext | E1000_CTRL_EXT_DRV_LOAD);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1646
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1647
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1648
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1649
/**
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1650
 * e1000_release_hw_control - release control of the h/w to f/w
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1651
 * @adapter: address of board private structure
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1652
 *
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1653
 * e1000_release_hw_control resets {CTRL_EXT|SWSM}:DRV_LOAD bit.
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1654
 * For ASF and Pass Through versions of f/w this means that the
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1655
 * driver is no longer loaded. For AMT version (only with 82573) i
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1656
 * of the f/w this means that the network i/f is closed.
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1657
 *
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1658
 **/
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1659
static void e1000_release_hw_control(struct e1000_adapter *adapter)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1660
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1661
	struct e1000_hw *hw = &adapter->hw;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1662
	u32 ctrl_ext;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1663
	u32 swsm;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1664
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1665
	/* Let firmware taken over control of h/w */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1666
	if (adapter->flags & FLAG_HAS_SWSM_ON_LOAD) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1667
		swsm = er32(SWSM);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1668
		ew32(SWSM, swsm & ~E1000_SWSM_DRV_LOAD);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1669
	} else if (adapter->flags & FLAG_HAS_CTRLEXT_ON_LOAD) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1670
		ctrl_ext = er32(CTRL_EXT);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1671
		ew32(CTRL_EXT, ctrl_ext & ~E1000_CTRL_EXT_DRV_LOAD);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1672
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1673
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1674
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1675
/**
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1676
 * @e1000_alloc_ring - allocate memory for a ring structure
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1677
 **/
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1678
static int e1000_alloc_ring_dma(struct e1000_adapter *adapter,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1679
				struct e1000_ring *ring)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1680
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1681
	struct pci_dev *pdev = adapter->pdev;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1682
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1683
	ring->desc = dma_alloc_coherent(&pdev->dev, ring->size, &ring->dma,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1684
					GFP_KERNEL);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1685
	if (!ring->desc)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1686
		return -ENOMEM;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1687
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1688
	return 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1689
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1690
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1691
/**
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1692
 * e1000e_setup_tx_resources - allocate Tx resources (Descriptors)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1693
 * @adapter: board private structure
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1694
 *
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1695
 * Return 0 on success, negative on failure
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1696
 **/
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1697
int e1000e_setup_tx_resources(struct e1000_adapter *adapter)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1698
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1699
	struct e1000_ring *tx_ring = adapter->tx_ring;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1700
	int err = -ENOMEM, size;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1701
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1702
	size = sizeof(struct e1000_buffer) * tx_ring->count;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1703
	tx_ring->buffer_info = vmalloc(size);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1704
	if (!tx_ring->buffer_info)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1705
		goto err;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1706
	memset(tx_ring->buffer_info, 0, size);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1707
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1708
	/* round up to nearest 4K */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1709
	tx_ring->size = tx_ring->count * sizeof(struct e1000_tx_desc);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1710
	tx_ring->size = ALIGN(tx_ring->size, 4096);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1711
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1712
	err = e1000_alloc_ring_dma(adapter, tx_ring);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1713
	if (err)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1714
		goto err;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1715
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1716
	tx_ring->next_to_use = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1717
	tx_ring->next_to_clean = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1718
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1719
	return 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1720
err:
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1721
	vfree(tx_ring->buffer_info);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1722
	e_err("Unable to allocate memory for the transmit descriptor ring\n");
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1723
	return err;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1724
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1725
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1726
/**
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1727
 * e1000e_setup_rx_resources - allocate Rx resources (Descriptors)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1728
 * @adapter: board private structure
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1729
 *
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1730
 * Returns 0 on success, negative on failure
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1731
 **/
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1732
int e1000e_setup_rx_resources(struct e1000_adapter *adapter)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1733
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1734
	struct e1000_ring *rx_ring = adapter->rx_ring;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1735
	struct e1000_buffer *buffer_info;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1736
	int i, size, desc_len, err = -ENOMEM;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1737
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1738
	size = sizeof(struct e1000_buffer) * rx_ring->count;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1739
	rx_ring->buffer_info = vmalloc(size);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1740
	if (!rx_ring->buffer_info)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1741
		goto err;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1742
	memset(rx_ring->buffer_info, 0, size);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1743
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1744
	for (i = 0; i < rx_ring->count; i++) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1745
		buffer_info = &rx_ring->buffer_info[i];
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1746
		buffer_info->ps_pages = kcalloc(PS_PAGE_BUFFERS,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1747
						sizeof(struct e1000_ps_page),
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1748
						GFP_KERNEL);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1749
		if (!buffer_info->ps_pages)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1750
			goto err_pages;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1751
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1752
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1753
	desc_len = sizeof(union e1000_rx_desc_packet_split);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1754
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1755
	/* Round up to nearest 4K */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1756
	rx_ring->size = rx_ring->count * desc_len;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1757
	rx_ring->size = ALIGN(rx_ring->size, 4096);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1758
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1759
	err = e1000_alloc_ring_dma(adapter, rx_ring);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1760
	if (err)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1761
		goto err_pages;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1762
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1763
	rx_ring->next_to_clean = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1764
	rx_ring->next_to_use = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1765
	rx_ring->rx_skb_top = NULL;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1766
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1767
	return 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1768
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1769
err_pages:
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1770
	for (i = 0; i < rx_ring->count; i++) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1771
		buffer_info = &rx_ring->buffer_info[i];
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1772
		kfree(buffer_info->ps_pages);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1773
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1774
err:
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1775
	vfree(rx_ring->buffer_info);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1776
	e_err("Unable to allocate memory for the transmit descriptor ring\n");
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1777
	return err;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1778
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1779
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1780
/**
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1781
 * e1000_clean_tx_ring - Free Tx Buffers
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1782
 * @adapter: board private structure
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1783
 **/
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1784
static void e1000_clean_tx_ring(struct e1000_adapter *adapter)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1785
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1786
	struct e1000_ring *tx_ring = adapter->tx_ring;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1787
	struct e1000_buffer *buffer_info;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1788
	unsigned long size;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1789
	unsigned int i;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1790
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1791
	for (i = 0; i < tx_ring->count; i++) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1792
		buffer_info = &tx_ring->buffer_info[i];
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1793
		e1000_put_txbuf(adapter, buffer_info);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1794
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1795
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1796
	size = sizeof(struct e1000_buffer) * tx_ring->count;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1797
	memset(tx_ring->buffer_info, 0, size);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1798
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1799
	memset(tx_ring->desc, 0, tx_ring->size);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1800
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1801
	tx_ring->next_to_use = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1802
	tx_ring->next_to_clean = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1803
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1804
	writel(0, adapter->hw.hw_addr + tx_ring->head);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1805
	writel(0, adapter->hw.hw_addr + tx_ring->tail);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1806
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1807
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1808
/**
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1809
 * e1000e_free_tx_resources - Free Tx Resources per Queue
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1810
 * @adapter: board private structure
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1811
 *
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1812
 * Free all transmit software resources
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1813
 **/
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1814
void e1000e_free_tx_resources(struct e1000_adapter *adapter)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1815
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1816
	struct pci_dev *pdev = adapter->pdev;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1817
	struct e1000_ring *tx_ring = adapter->tx_ring;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1818
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1819
	e1000_clean_tx_ring(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1820
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1821
	vfree(tx_ring->buffer_info);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1822
	tx_ring->buffer_info = NULL;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1823
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1824
	dma_free_coherent(&pdev->dev, tx_ring->size, tx_ring->desc,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1825
			  tx_ring->dma);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1826
	tx_ring->desc = NULL;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1827
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1828
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1829
/**
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1830
 * e1000e_free_rx_resources - Free Rx Resources
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1831
 * @adapter: board private structure
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1832
 *
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1833
 * Free all receive software resources
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1834
 **/
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1835
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1836
void e1000e_free_rx_resources(struct e1000_adapter *adapter)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1837
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1838
	struct pci_dev *pdev = adapter->pdev;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1839
	struct e1000_ring *rx_ring = adapter->rx_ring;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1840
	int i;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1841
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1842
	e1000_clean_rx_ring(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1843
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1844
	for (i = 0; i < rx_ring->count; i++) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1845
		kfree(rx_ring->buffer_info[i].ps_pages);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1846
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1847
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1848
	vfree(rx_ring->buffer_info);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1849
	rx_ring->buffer_info = NULL;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1850
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1851
	dma_free_coherent(&pdev->dev, rx_ring->size, rx_ring->desc,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1852
			  rx_ring->dma);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1853
	rx_ring->desc = NULL;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1854
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1855
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1856
/**
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1857
 * e1000_update_itr - update the dynamic ITR value based on statistics
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1858
 * @adapter: pointer to adapter
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1859
 * @itr_setting: current adapter->itr
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1860
 * @packets: the number of packets during this measurement interval
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1861
 * @bytes: the number of bytes during this measurement interval
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1862
 *
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1863
 *      Stores a new ITR value based on packets and byte
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1864
 *      counts during the last interrupt.  The advantage of per interrupt
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1865
 *      computation is faster updates and more accurate ITR for the current
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1866
 *      traffic pattern.  Constants in this function were computed
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1867
 *      based on theoretical maximum wire speed and thresholds were set based
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1868
 *      on testing data as well as attempting to minimize response time
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1869
 *      while increasing bulk throughput.  This functionality is controlled
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1870
 *      by the InterruptThrottleRate module parameter.
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1871
 **/
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1872
static unsigned int e1000_update_itr(struct e1000_adapter *adapter,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1873
				     u16 itr_setting, int packets,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1874
				     int bytes)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1875
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1876
	unsigned int retval = itr_setting;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1877
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1878
	if (packets == 0)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1879
		goto update_itr_done;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1880
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1881
	switch (itr_setting) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1882
	case lowest_latency:
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1883
		/* handle TSO and jumbo frames */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1884
		if (bytes/packets > 8000)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1885
			retval = bulk_latency;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1886
		else if ((packets < 5) && (bytes > 512)) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1887
			retval = low_latency;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1888
		}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1889
		break;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1890
	case low_latency:  /* 50 usec aka 20000 ints/s */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1891
		if (bytes > 10000) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1892
			/* this if handles the TSO accounting */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1893
			if (bytes/packets > 8000) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1894
				retval = bulk_latency;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1895
			} else if ((packets < 10) || ((bytes/packets) > 1200)) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1896
				retval = bulk_latency;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1897
			} else if ((packets > 35)) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1898
				retval = lowest_latency;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1899
			}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1900
		} else if (bytes/packets > 2000) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1901
			retval = bulk_latency;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1902
		} else if (packets <= 2 && bytes < 512) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1903
			retval = lowest_latency;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1904
		}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1905
		break;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1906
	case bulk_latency: /* 250 usec aka 4000 ints/s */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1907
		if (bytes > 25000) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1908
			if (packets > 35) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1909
				retval = low_latency;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1910
			}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1911
		} else if (bytes < 6000) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1912
			retval = low_latency;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1913
		}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1914
		break;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1915
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1916
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1917
update_itr_done:
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1918
	return retval;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1919
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1920
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1921
static void e1000_set_itr(struct e1000_adapter *adapter)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1922
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1923
	struct e1000_hw *hw = &adapter->hw;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1924
	u16 current_itr;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1925
	u32 new_itr = adapter->itr;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1926
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1927
	/* for non-gigabit speeds, just fix the interrupt rate at 4000 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1928
	if (adapter->link_speed != SPEED_1000) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1929
		current_itr = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1930
		new_itr = 4000;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1931
		goto set_itr_now;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1932
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1933
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1934
	adapter->tx_itr = e1000_update_itr(adapter,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1935
				    adapter->tx_itr,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1936
				    adapter->total_tx_packets,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1937
				    adapter->total_tx_bytes);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1938
	/* conservative mode (itr 3) eliminates the lowest_latency setting */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1939
	if (adapter->itr_setting == 3 && adapter->tx_itr == lowest_latency)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1940
		adapter->tx_itr = low_latency;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1941
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1942
	adapter->rx_itr = e1000_update_itr(adapter,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1943
				    adapter->rx_itr,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1944
				    adapter->total_rx_packets,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1945
				    adapter->total_rx_bytes);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1946
	/* conservative mode (itr 3) eliminates the lowest_latency setting */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1947
	if (adapter->itr_setting == 3 && adapter->rx_itr == lowest_latency)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1948
		adapter->rx_itr = low_latency;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1949
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1950
	current_itr = max(adapter->rx_itr, adapter->tx_itr);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1951
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1952
	switch (current_itr) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1953
	/* counts and packets in update_itr are dependent on these numbers */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1954
	case lowest_latency:
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1955
		new_itr = 70000;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1956
		break;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1957
	case low_latency:
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1958
		new_itr = 20000; /* aka hwitr = ~200 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1959
		break;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1960
	case bulk_latency:
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1961
		new_itr = 4000;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1962
		break;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1963
	default:
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1964
		break;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1965
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1966
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1967
set_itr_now:
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1968
	if (new_itr != adapter->itr) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1969
		/*
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1970
		 * this attempts to bias the interrupt rate towards Bulk
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1971
		 * by adding intermediate steps when interrupt rate is
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1972
		 * increasing
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1973
		 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1974
		new_itr = new_itr > adapter->itr ?
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1975
			     min(adapter->itr + (new_itr >> 2), new_itr) :
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1976
			     new_itr;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1977
		adapter->itr = new_itr;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1978
		adapter->rx_ring->itr_val = new_itr;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1979
		if (adapter->msix_entries)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1980
			adapter->rx_ring->set_itr = 1;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1981
		else
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1982
			ew32(ITR, 1000000000 / (new_itr * 256));
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1983
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1984
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1985
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1986
/**
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1987
 * e1000_alloc_queues - Allocate memory for all rings
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1988
 * @adapter: board private structure to initialize
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1989
 **/
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1990
static int __devinit e1000_alloc_queues(struct e1000_adapter *adapter)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1991
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1992
	adapter->tx_ring = kzalloc(sizeof(struct e1000_ring), GFP_KERNEL);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1993
	if (!adapter->tx_ring)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1994
		goto err;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1995
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1996
	adapter->rx_ring = kzalloc(sizeof(struct e1000_ring), GFP_KERNEL);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1997
	if (!adapter->rx_ring)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1998
		goto err;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1999
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2000
	return 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2001
err:
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2002
	e_err("Unable to allocate memory for queues\n");
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2003
	kfree(adapter->rx_ring);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2004
	kfree(adapter->tx_ring);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2005
	return -ENOMEM;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2006
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2007
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2008
/**
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2009
 * e1000_clean - NAPI Rx polling callback
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2010
 * @napi: struct associated with this polling callback
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2011
 * @budget: amount of packets driver is allowed to process this poll
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2012
 **/
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2013
static int e1000_clean(struct napi_struct *napi, int budget)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2014
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2015
	struct e1000_adapter *adapter = container_of(napi, struct e1000_adapter, napi);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2016
	struct e1000_hw *hw = &adapter->hw;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2017
	struct net_device *poll_dev = adapter->netdev;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2018
	int tx_cleaned = 1, work_done = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2019
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2020
	adapter = netdev_priv(poll_dev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2021
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2022
	if (adapter->msix_entries &&
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2023
	    !(adapter->rx_ring->ims_val & adapter->tx_ring->ims_val))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2024
		goto clean_rx;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2025
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2026
	tx_cleaned = e1000_clean_tx_irq(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2027
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2028
clean_rx:
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2029
	adapter->clean_rx(adapter, &work_done, budget);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2030
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2031
	if (!tx_cleaned)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2032
		work_done = budget;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2033
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2034
	/* If budget not fully consumed, exit the polling mode */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2035
	if (work_done < budget) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2036
		if (adapter->itr_setting & 3)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2037
			e1000_set_itr(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2038
		napi_complete(napi);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2039
		if (!test_bit(__E1000_DOWN, &adapter->state)) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2040
			if (adapter->msix_entries)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2041
				ew32(IMS, adapter->rx_ring->ims_val);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2042
			else
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2043
				e1000_irq_enable(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2044
		}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2045
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2046
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2047
	return work_done;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2048
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2049
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2050
static void e1000_vlan_rx_add_vid(struct net_device *netdev, u16 vid)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2051
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2052
	struct e1000_adapter *adapter = netdev_priv(netdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2053
	struct e1000_hw *hw = &adapter->hw;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2054
	u32 vfta, index;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2055
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2056
	/* don't update vlan cookie if already programmed */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2057
	if ((adapter->hw.mng_cookie.status &
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2058
	     E1000_MNG_DHCP_COOKIE_STATUS_VLAN) &&
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2059
	    (vid == adapter->mng_vlan_id))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2060
		return;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2061
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2062
	/* add VID to filter table */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2063
	if (adapter->flags & FLAG_HAS_HW_VLAN_FILTER) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2064
		index = (vid >> 5) & 0x7F;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2065
		vfta = E1000_READ_REG_ARRAY(hw, E1000_VFTA, index);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2066
		vfta |= (1 << (vid & 0x1F));
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2067
		hw->mac.ops.write_vfta(hw, index, vfta);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2068
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2069
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2070
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2071
static void e1000_vlan_rx_kill_vid(struct net_device *netdev, u16 vid)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2072
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2073
	struct e1000_adapter *adapter = netdev_priv(netdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2074
	struct e1000_hw *hw = &adapter->hw;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2075
	u32 vfta, index;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2076
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2077
	if (!test_bit(__E1000_DOWN, &adapter->state))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2078
		e1000_irq_disable(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2079
	vlan_group_set_device(adapter->vlgrp, vid, NULL);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2080
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2081
	if (!test_bit(__E1000_DOWN, &adapter->state))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2082
		e1000_irq_enable(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2083
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2084
	if ((adapter->hw.mng_cookie.status &
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2085
	     E1000_MNG_DHCP_COOKIE_STATUS_VLAN) &&
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2086
	    (vid == adapter->mng_vlan_id)) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2087
		/* release control to f/w */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2088
		e1000_release_hw_control(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2089
		return;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2090
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2091
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2092
	/* remove VID from filter table */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2093
	if (adapter->flags & FLAG_HAS_HW_VLAN_FILTER) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2094
		index = (vid >> 5) & 0x7F;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2095
		vfta = E1000_READ_REG_ARRAY(hw, E1000_VFTA, index);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2096
		vfta &= ~(1 << (vid & 0x1F));
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2097
		hw->mac.ops.write_vfta(hw, index, vfta);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2098
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2099
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2100
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2101
static void e1000_update_mng_vlan(struct e1000_adapter *adapter)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2102
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2103
	struct net_device *netdev = adapter->netdev;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2104
	u16 vid = adapter->hw.mng_cookie.vlan_id;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2105
	u16 old_vid = adapter->mng_vlan_id;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2106
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2107
	if (!adapter->vlgrp)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2108
		return;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2109
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2110
	if (!vlan_group_get_device(adapter->vlgrp, vid)) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2111
		adapter->mng_vlan_id = E1000_MNG_VLAN_NONE;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2112
		if (adapter->hw.mng_cookie.status &
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2113
			E1000_MNG_DHCP_COOKIE_STATUS_VLAN) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2114
			e1000_vlan_rx_add_vid(netdev, vid);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2115
			adapter->mng_vlan_id = vid;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2116
		}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2117
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2118
		if ((old_vid != (u16)E1000_MNG_VLAN_NONE) &&
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2119
				(vid != old_vid) &&
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2120
		    !vlan_group_get_device(adapter->vlgrp, old_vid))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2121
			e1000_vlan_rx_kill_vid(netdev, old_vid);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2122
	} else {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2123
		adapter->mng_vlan_id = vid;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2124
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2125
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2126
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2127
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2128
static void e1000_vlan_rx_register(struct net_device *netdev,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2129
				   struct vlan_group *grp)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2130
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2131
	struct e1000_adapter *adapter = netdev_priv(netdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2132
	struct e1000_hw *hw = &adapter->hw;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2133
	u32 ctrl, rctl;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2134
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2135
	if (!test_bit(__E1000_DOWN, &adapter->state))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2136
		e1000_irq_disable(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2137
	adapter->vlgrp = grp;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2138
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2139
	if (grp) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2140
		/* enable VLAN tag insert/strip */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2141
		ctrl = er32(CTRL);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2142
		ctrl |= E1000_CTRL_VME;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2143
		ew32(CTRL, ctrl);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2144
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2145
		if (adapter->flags & FLAG_HAS_HW_VLAN_FILTER) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2146
			/* enable VLAN receive filtering */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2147
			rctl = er32(RCTL);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2148
			rctl &= ~E1000_RCTL_CFIEN;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2149
			ew32(RCTL, rctl);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2150
			e1000_update_mng_vlan(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2151
		}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2152
	} else {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2153
		/* disable VLAN tag insert/strip */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2154
		ctrl = er32(CTRL);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2155
		ctrl &= ~E1000_CTRL_VME;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2156
		ew32(CTRL, ctrl);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2157
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2158
		if (adapter->flags & FLAG_HAS_HW_VLAN_FILTER) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2159
			if (adapter->mng_vlan_id !=
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2160
			    (u16)E1000_MNG_VLAN_NONE) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2161
				e1000_vlan_rx_kill_vid(netdev,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2162
						       adapter->mng_vlan_id);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2163
				adapter->mng_vlan_id = E1000_MNG_VLAN_NONE;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2164
			}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2165
		}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2166
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2167
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2168
	if (!test_bit(__E1000_DOWN, &adapter->state))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2169
		e1000_irq_enable(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2170
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2171
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2172
static void e1000_restore_vlan(struct e1000_adapter *adapter)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2173
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2174
	u16 vid;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2175
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2176
	e1000_vlan_rx_register(adapter->netdev, adapter->vlgrp);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2177
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2178
	if (!adapter->vlgrp)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2179
		return;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2180
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2181
	for (vid = 0; vid < VLAN_GROUP_ARRAY_LEN; vid++) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2182
		if (!vlan_group_get_device(adapter->vlgrp, vid))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2183
			continue;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2184
		e1000_vlan_rx_add_vid(adapter->netdev, vid);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2185
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2186
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2187
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2188
static void e1000_init_manageability(struct e1000_adapter *adapter)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2189
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2190
	struct e1000_hw *hw = &adapter->hw;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2191
	u32 manc, manc2h;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2192
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2193
	if (!(adapter->flags & FLAG_MNG_PT_ENABLED))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2194
		return;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2195
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2196
	manc = er32(MANC);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2197
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2198
	/*
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2199
	 * enable receiving management packets to the host. this will probably
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2200
	 * generate destination unreachable messages from the host OS, but
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2201
	 * the packets will be handled on SMBUS
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2202
	 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2203
	manc |= E1000_MANC_EN_MNG2HOST;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2204
	manc2h = er32(MANC2H);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2205
#define E1000_MNG2HOST_PORT_623 (1 << 5)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2206
#define E1000_MNG2HOST_PORT_664 (1 << 6)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2207
	manc2h |= E1000_MNG2HOST_PORT_623;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2208
	manc2h |= E1000_MNG2HOST_PORT_664;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2209
	ew32(MANC2H, manc2h);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2210
	ew32(MANC, manc);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2211
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2212
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2213
/**
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2214
 * e1000_configure_tx - Configure 8254x Transmit Unit after Reset
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2215
 * @adapter: board private structure
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2216
 *
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2217
 * Configure the Tx unit of the MAC after a reset.
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2218
 **/
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2219
static void e1000_configure_tx(struct e1000_adapter *adapter)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2220
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2221
	struct e1000_hw *hw = &adapter->hw;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2222
	struct e1000_ring *tx_ring = adapter->tx_ring;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2223
	u64 tdba;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2224
	u32 tdlen, tctl, tipg, tarc;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2225
	u32 ipgr1, ipgr2;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2226
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2227
	/* Setup the HW Tx Head and Tail descriptor pointers */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2228
	tdba = tx_ring->dma;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2229
	tdlen = tx_ring->count * sizeof(struct e1000_tx_desc);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2230
	ew32(TDBAL, (tdba & DMA_BIT_MASK(32)));
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2231
	ew32(TDBAH, (tdba >> 32));
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2232
	ew32(TDLEN, tdlen);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2233
	ew32(TDH, 0);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2234
	ew32(TDT, 0);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2235
	tx_ring->head = E1000_TDH;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2236
	tx_ring->tail = E1000_TDT;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2237
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2238
	/* Set the default values for the Tx Inter Packet Gap timer */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2239
	tipg = DEFAULT_82543_TIPG_IPGT_COPPER;          /*  8  */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2240
	ipgr1 = DEFAULT_82543_TIPG_IPGR1;               /*  8  */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2241
	ipgr2 = DEFAULT_82543_TIPG_IPGR2;               /*  6  */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2242
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2243
	if (adapter->flags & FLAG_TIPG_MEDIUM_FOR_80003ESLAN)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2244
		ipgr2 = DEFAULT_80003ES2LAN_TIPG_IPGR2; /*  7  */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2245
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2246
	tipg |= ipgr1 << E1000_TIPG_IPGR1_SHIFT;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2247
	tipg |= ipgr2 << E1000_TIPG_IPGR2_SHIFT;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2248
	ew32(TIPG, tipg);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2249
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2250
	/* Set the Tx Interrupt Delay register */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2251
	ew32(TIDV, adapter->tx_int_delay);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2252
	/* Tx irq moderation */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2253
	ew32(TADV, adapter->tx_abs_int_delay);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2254
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2255
	/* Program the Transmit Control Register */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2256
	tctl = er32(TCTL);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2257
	tctl &= ~E1000_TCTL_CT;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2258
	tctl |= E1000_TCTL_PSP | E1000_TCTL_RTLC |
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2259
		(E1000_COLLISION_THRESHOLD << E1000_CT_SHIFT);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2260
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2261
	if (adapter->flags & FLAG_TARC_SPEED_MODE_BIT) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2262
		tarc = er32(TARC(0));
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2263
		/*
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2264
		 * set the speed mode bit, we'll clear it if we're not at
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2265
		 * gigabit link later
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2266
		 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2267
#define SPEED_MODE_BIT (1 << 21)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2268
		tarc |= SPEED_MODE_BIT;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2269
		ew32(TARC(0), tarc);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2270
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2271
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2272
	/* errata: program both queues to unweighted RR */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2273
	if (adapter->flags & FLAG_TARC_SET_BIT_ZERO) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2274
		tarc = er32(TARC(0));
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2275
		tarc |= 1;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2276
		ew32(TARC(0), tarc);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2277
		tarc = er32(TARC(1));
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2278
		tarc |= 1;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2279
		ew32(TARC(1), tarc);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2280
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2281
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2282
	/* Setup Transmit Descriptor Settings for eop descriptor */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2283
	adapter->txd_cmd = E1000_TXD_CMD_EOP | E1000_TXD_CMD_IFCS;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2284
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2285
	/* only set IDE if we are delaying interrupts using the timers */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2286
	if (adapter->tx_int_delay)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2287
		adapter->txd_cmd |= E1000_TXD_CMD_IDE;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2288
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2289
	/* enable Report Status bit */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2290
	adapter->txd_cmd |= E1000_TXD_CMD_RS;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2291
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2292
	ew32(TCTL, tctl);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2293
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2294
	e1000e_config_collision_dist(hw);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2295
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2296
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2297
/**
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2298
 * e1000_setup_rctl - configure the receive control registers
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2299
 * @adapter: Board private structure
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2300
 **/
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2301
#define PAGE_USE_COUNT(S) (((S) >> PAGE_SHIFT) + \
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2302
			   (((S) & (PAGE_SIZE - 1)) ? 1 : 0))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2303
static void e1000_setup_rctl(struct e1000_adapter *adapter)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2304
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2305
	struct e1000_hw *hw = &adapter->hw;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2306
	u32 rctl, rfctl;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2307
	u32 psrctl = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2308
	u32 pages = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2309
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2310
	/* Program MC offset vector base */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2311
	rctl = er32(RCTL);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2312
	rctl &= ~(3 << E1000_RCTL_MO_SHIFT);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2313
	rctl |= E1000_RCTL_EN | E1000_RCTL_BAM |
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2314
		E1000_RCTL_LBM_NO | E1000_RCTL_RDMTS_HALF |
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2315
		(adapter->hw.mac.mc_filter_type << E1000_RCTL_MO_SHIFT);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2316
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2317
	/* Do not Store bad packets */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2318
	rctl &= ~E1000_RCTL_SBP;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2319
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2320
	/* Enable Long Packet receive */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2321
	if (adapter->netdev->mtu <= ETH_DATA_LEN)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2322
		rctl &= ~E1000_RCTL_LPE;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2323
	else
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2324
		rctl |= E1000_RCTL_LPE;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2325
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2326
	/* Some systems expect that the CRC is included in SMBUS traffic. The
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2327
	 * hardware strips the CRC before sending to both SMBUS (BMC) and to
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2328
	 * host memory when this is enabled
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2329
	 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2330
	if (adapter->flags2 & FLAG2_CRC_STRIPPING)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2331
		rctl |= E1000_RCTL_SECRC;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2332
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2333
	/* Workaround Si errata on 82577 PHY - configure IPG for jumbos */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2334
	if ((hw->phy.type == e1000_phy_82577) && (rctl & E1000_RCTL_LPE)) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2335
		u16 phy_data;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2336
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2337
		e1e_rphy(hw, PHY_REG(770, 26), &phy_data);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2338
		phy_data &= 0xfff8;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2339
		phy_data |= (1 << 2);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2340
		e1e_wphy(hw, PHY_REG(770, 26), phy_data);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2341
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2342
		e1e_rphy(hw, 22, &phy_data);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2343
		phy_data &= 0x0fff;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2344
		phy_data |= (1 << 14);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2345
		e1e_wphy(hw, 0x10, 0x2823);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2346
		e1e_wphy(hw, 0x11, 0x0003);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2347
		e1e_wphy(hw, 22, phy_data);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2348
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2349
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2350
	/* Setup buffer sizes */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2351
	rctl &= ~E1000_RCTL_SZ_4096;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2352
	rctl |= E1000_RCTL_BSEX;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2353
	switch (adapter->rx_buffer_len) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2354
	case 2048:
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2355
	default:
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2356
		rctl |= E1000_RCTL_SZ_2048;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2357
		rctl &= ~E1000_RCTL_BSEX;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2358
		break;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2359
	case 4096:
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2360
		rctl |= E1000_RCTL_SZ_4096;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2361
		break;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2362
	case 8192:
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2363
		rctl |= E1000_RCTL_SZ_8192;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2364
		break;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2365
	case 16384:
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2366
		rctl |= E1000_RCTL_SZ_16384;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2367
		break;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2368
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2369
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2370
	/*
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2371
	 * 82571 and greater support packet-split where the protocol
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2372
	 * header is placed in skb->data and the packet data is
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2373
	 * placed in pages hanging off of skb_shinfo(skb)->nr_frags.
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2374
	 * In the case of a non-split, skb->data is linearly filled,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2375
	 * followed by the page buffers.  Therefore, skb->data is
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2376
	 * sized to hold the largest protocol header.
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2377
	 *
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2378
	 * allocations using alloc_page take too long for regular MTU
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2379
	 * so only enable packet split for jumbo frames
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2380
	 *
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2381
	 * Using pages when the page size is greater than 16k wastes
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2382
	 * a lot of memory, since we allocate 3 pages at all times
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2383
	 * per packet.
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2384
	 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2385
	pages = PAGE_USE_COUNT(adapter->netdev->mtu);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2386
	if (!(adapter->flags & FLAG_IS_ICH) && (pages <= 3) &&
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2387
	    (PAGE_SIZE <= 16384) && (rctl & E1000_RCTL_LPE))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2388
		adapter->rx_ps_pages = pages;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2389
	else
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2390
		adapter->rx_ps_pages = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2391
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2392
	if (adapter->rx_ps_pages) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2393
		/* Configure extra packet-split registers */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2394
		rfctl = er32(RFCTL);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2395
		rfctl |= E1000_RFCTL_EXTEN;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2396
		/*
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2397
		 * disable packet split support for IPv6 extension headers,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2398
		 * because some malformed IPv6 headers can hang the Rx
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2399
		 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2400
		rfctl |= (E1000_RFCTL_IPV6_EX_DIS |
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2401
			  E1000_RFCTL_NEW_IPV6_EXT_DIS);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2402
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2403
		ew32(RFCTL, rfctl);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2404
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2405
		/* Enable Packet split descriptors */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2406
		rctl |= E1000_RCTL_DTYP_PS;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2407
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2408
		psrctl |= adapter->rx_ps_bsize0 >>
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2409
			E1000_PSRCTL_BSIZE0_SHIFT;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2410
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2411
		switch (adapter->rx_ps_pages) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2412
		case 3:
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2413
			psrctl |= PAGE_SIZE <<
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2414
				E1000_PSRCTL_BSIZE3_SHIFT;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2415
		case 2:
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2416
			psrctl |= PAGE_SIZE <<
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2417
				E1000_PSRCTL_BSIZE2_SHIFT;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2418
		case 1:
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2419
			psrctl |= PAGE_SIZE >>
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2420
				E1000_PSRCTL_BSIZE1_SHIFT;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2421
			break;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2422
		}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2423
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2424
		ew32(PSRCTL, psrctl);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2425
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2426
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2427
	ew32(RCTL, rctl);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2428
	/* just started the receive unit, no need to restart */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2429
	adapter->flags &= ~FLAG_RX_RESTART_NOW;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2430
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2431
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2432
/**
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2433
 * e1000_configure_rx - Configure Receive Unit after Reset
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2434
 * @adapter: board private structure
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2435
 *
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2436
 * Configure the Rx unit of the MAC after a reset.
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2437
 **/
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2438
static void e1000_configure_rx(struct e1000_adapter *adapter)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2439
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2440
	struct e1000_hw *hw = &adapter->hw;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2441
	struct e1000_ring *rx_ring = adapter->rx_ring;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2442
	u64 rdba;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2443
	u32 rdlen, rctl, rxcsum, ctrl_ext;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2444
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2445
	if (adapter->rx_ps_pages) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2446
		/* this is a 32 byte descriptor */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2447
		rdlen = rx_ring->count *
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2448
			sizeof(union e1000_rx_desc_packet_split);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2449
		adapter->clean_rx = e1000_clean_rx_irq_ps;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2450
		adapter->alloc_rx_buf = e1000_alloc_rx_buffers_ps;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2451
	} else if (adapter->netdev->mtu > ETH_FRAME_LEN + ETH_FCS_LEN) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2452
		rdlen = rx_ring->count * sizeof(struct e1000_rx_desc);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2453
		adapter->clean_rx = e1000_clean_jumbo_rx_irq;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2454
		adapter->alloc_rx_buf = e1000_alloc_jumbo_rx_buffers;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2455
	} else {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2456
		rdlen = rx_ring->count * sizeof(struct e1000_rx_desc);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2457
		adapter->clean_rx = e1000_clean_rx_irq;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2458
		adapter->alloc_rx_buf = e1000_alloc_rx_buffers;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2459
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2460
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2461
	/* disable receives while setting up the descriptors */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2462
	rctl = er32(RCTL);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2463
	ew32(RCTL, rctl & ~E1000_RCTL_EN);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2464
	e1e_flush();
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2465
	msleep(10);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2466
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2467
	/* set the Receive Delay Timer Register */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2468
	ew32(RDTR, adapter->rx_int_delay);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2469
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2470
	/* irq moderation */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2471
	ew32(RADV, adapter->rx_abs_int_delay);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2472
	if (adapter->itr_setting != 0)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2473
		ew32(ITR, 1000000000 / (adapter->itr * 256));
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2474
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2475
	ctrl_ext = er32(CTRL_EXT);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2476
	/* Auto-Mask interrupts upon ICR access */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2477
	ctrl_ext |= E1000_CTRL_EXT_IAME;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2478
	ew32(IAM, 0xffffffff);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2479
	ew32(CTRL_EXT, ctrl_ext);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2480
	e1e_flush();
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2481
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2482
	/*
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2483
	 * Setup the HW Rx Head and Tail Descriptor Pointers and
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2484
	 * the Base and Length of the Rx Descriptor Ring
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2485
	 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2486
	rdba = rx_ring->dma;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2487
	ew32(RDBAL, (rdba & DMA_BIT_MASK(32)));
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2488
	ew32(RDBAH, (rdba >> 32));
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2489
	ew32(RDLEN, rdlen);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2490
	ew32(RDH, 0);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2491
	ew32(RDT, 0);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2492
	rx_ring->head = E1000_RDH;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2493
	rx_ring->tail = E1000_RDT;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2494
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2495
	/* Enable Receive Checksum Offload for TCP and UDP */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2496
	rxcsum = er32(RXCSUM);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2497
	if (adapter->flags & FLAG_RX_CSUM_ENABLED) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2498
		rxcsum |= E1000_RXCSUM_TUOFL;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2499
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2500
		/*
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2501
		 * IPv4 payload checksum for UDP fragments must be
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2502
		 * used in conjunction with packet-split.
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2503
		 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2504
		if (adapter->rx_ps_pages)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2505
			rxcsum |= E1000_RXCSUM_IPPCSE;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2506
	} else {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2507
		rxcsum &= ~E1000_RXCSUM_TUOFL;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2508
		/* no need to clear IPPCSE as it defaults to 0 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2509
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2510
	ew32(RXCSUM, rxcsum);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2511
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2512
	/*
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2513
	 * Enable early receives on supported devices, only takes effect when
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2514
	 * packet size is equal or larger than the specified value (in 8 byte
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2515
	 * units), e.g. using jumbo frames when setting to E1000_ERT_2048
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2516
	 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2517
	if (adapter->flags & FLAG_HAS_ERT) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2518
		if (adapter->netdev->mtu > ETH_DATA_LEN) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2519
			u32 rxdctl = er32(RXDCTL(0));
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2520
			ew32(RXDCTL(0), rxdctl | 0x3);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2521
			ew32(ERT, E1000_ERT_2048 | (1 << 13));
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2522
			/*
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2523
			 * With jumbo frames and early-receive enabled,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2524
			 * excessive C-state transition latencies result in
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2525
			 * dropped transactions.
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2526
			 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2527
			pm_qos_update_requirement(PM_QOS_CPU_DMA_LATENCY,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2528
						  adapter->netdev->name, 55);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2529
		} else {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2530
			pm_qos_update_requirement(PM_QOS_CPU_DMA_LATENCY,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2531
						  adapter->netdev->name,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2532
						  PM_QOS_DEFAULT_VALUE);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2533
		}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2534
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2535
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2536
	/* Enable Receives */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2537
	ew32(RCTL, rctl);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2538
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2539
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2540
/**
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2541
 *  e1000_update_mc_addr_list - Update Multicast addresses
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2542
 *  @hw: pointer to the HW structure
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2543
 *  @mc_addr_list: array of multicast addresses to program
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2544
 *  @mc_addr_count: number of multicast addresses to program
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2545
 *
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2546
 *  Updates the Multicast Table Array.
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2547
 *  The caller must have a packed mc_addr_list of multicast addresses.
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2548
 **/
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2549
static void e1000_update_mc_addr_list(struct e1000_hw *hw, u8 *mc_addr_list,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2550
				      u32 mc_addr_count)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2551
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2552
	hw->mac.ops.update_mc_addr_list(hw, mc_addr_list, mc_addr_count);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2553
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2554
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2555
/**
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2556
 * e1000_set_multi - Multicast and Promiscuous mode set
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2557
 * @netdev: network interface device structure
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2558
 *
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2559
 * The set_multi entry point is called whenever the multicast address
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2560
 * list or the network interface flags are updated.  This routine is
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2561
 * responsible for configuring the hardware for proper multicast,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2562
 * promiscuous mode, and all-multi behavior.
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2563
 **/
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2564
static void e1000_set_multi(struct net_device *netdev)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2565
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2566
	struct e1000_adapter *adapter = netdev_priv(netdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2567
	struct e1000_hw *hw = &adapter->hw;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2568
	struct dev_mc_list *mc_ptr;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2569
	u8  *mta_list;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2570
	u32 rctl;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2571
	int i;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2572
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2573
	/* Check for Promiscuous and All Multicast modes */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2574
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2575
	rctl = er32(RCTL);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2576
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2577
	if (netdev->flags & IFF_PROMISC) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2578
		rctl |= (E1000_RCTL_UPE | E1000_RCTL_MPE);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2579
		rctl &= ~E1000_RCTL_VFE;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2580
	} else {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2581
		if (netdev->flags & IFF_ALLMULTI) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2582
			rctl |= E1000_RCTL_MPE;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2583
			rctl &= ~E1000_RCTL_UPE;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2584
		} else {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2585
			rctl &= ~(E1000_RCTL_UPE | E1000_RCTL_MPE);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2586
		}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2587
		if (adapter->flags & FLAG_HAS_HW_VLAN_FILTER)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2588
			rctl |= E1000_RCTL_VFE;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2589
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2590
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2591
	ew32(RCTL, rctl);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2592
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2593
	if (!netdev_mc_empty(netdev)) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2594
		mta_list = kmalloc(netdev_mc_count(netdev) * 6, GFP_ATOMIC);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2595
		if (!mta_list)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2596
			return;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2597
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2598
		/* prepare a packed array of only addresses. */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2599
		i = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2600
		netdev_for_each_mc_addr(mc_ptr, netdev)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2601
			memcpy(mta_list + (i++ * ETH_ALEN),
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2602
			       mc_ptr->dmi_addr, ETH_ALEN);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2603
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2604
		e1000_update_mc_addr_list(hw, mta_list, i);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2605
		kfree(mta_list);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2606
	} else {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2607
		/*
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2608
		 * if we're called from probe, we might not have
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2609
		 * anything to do here, so clear out the list
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2610
		 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2611
		e1000_update_mc_addr_list(hw, NULL, 0);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2612
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2613
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2614
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2615
/**
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2616
 * e1000_configure - configure the hardware for Rx and Tx
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2617
 * @adapter: private board structure
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2618
 **/
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2619
static void e1000_configure(struct e1000_adapter *adapter)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2620
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2621
	e1000_set_multi(adapter->netdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2622
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2623
	e1000_restore_vlan(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2624
	e1000_init_manageability(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2625
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2626
	e1000_configure_tx(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2627
	e1000_setup_rctl(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2628
	e1000_configure_rx(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2629
	adapter->alloc_rx_buf(adapter, e1000_desc_unused(adapter->rx_ring));
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2630
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2631
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2632
/**
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2633
 * e1000e_power_up_phy - restore link in case the phy was powered down
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2634
 * @adapter: address of board private structure
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2635
 *
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2636
 * The phy may be powered down to save power and turn off link when the
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2637
 * driver is unloaded and wake on lan is not enabled (among others)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2638
 * *** this routine MUST be followed by a call to e1000e_reset ***
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2639
 **/
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2640
void e1000e_power_up_phy(struct e1000_adapter *adapter)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2641
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2642
	if (adapter->hw.phy.ops.power_up)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2643
		adapter->hw.phy.ops.power_up(&adapter->hw);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2644
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2645
	adapter->hw.mac.ops.setup_link(&adapter->hw);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2646
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2647
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2648
/**
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2649
 * e1000_power_down_phy - Power down the PHY
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2650
 *
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2651
 * Power down the PHY so no link is implied when interface is down.
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2652
 * The PHY cannot be powered down if management or WoL is active.
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2653
 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2654
static void e1000_power_down_phy(struct e1000_adapter *adapter)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2655
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2656
	/* WoL is enabled */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2657
	if (adapter->wol)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2658
		return;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2659
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2660
	if (adapter->hw.phy.ops.power_down)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2661
		adapter->hw.phy.ops.power_down(&adapter->hw);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2662
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2663
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2664
/**
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2665
 * e1000e_reset - bring the hardware into a known good state
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2666
 *
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2667
 * This function boots the hardware and enables some settings that
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2668
 * require a configuration cycle of the hardware - those cannot be
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2669
 * set/changed during runtime. After reset the device needs to be
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2670
 * properly configured for Rx, Tx etc.
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2671
 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2672
void e1000e_reset(struct e1000_adapter *adapter)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2673
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2674
	struct e1000_mac_info *mac = &adapter->hw.mac;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2675
	struct e1000_fc_info *fc = &adapter->hw.fc;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2676
	struct e1000_hw *hw = &adapter->hw;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2677
	u32 tx_space, min_tx_space, min_rx_space;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2678
	u32 pba = adapter->pba;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2679
	u16 hwm;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2680
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2681
	/* reset Packet Buffer Allocation to default */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2682
	ew32(PBA, pba);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2683
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2684
	if (adapter->max_frame_size > ETH_FRAME_LEN + ETH_FCS_LEN) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2685
		/*
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2686
		 * To maintain wire speed transmits, the Tx FIFO should be
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2687
		 * large enough to accommodate two full transmit packets,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2688
		 * rounded up to the next 1KB and expressed in KB.  Likewise,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2689
		 * the Rx FIFO should be large enough to accommodate at least
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2690
		 * one full receive packet and is similarly rounded up and
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2691
		 * expressed in KB.
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2692
		 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2693
		pba = er32(PBA);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2694
		/* upper 16 bits has Tx packet buffer allocation size in KB */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2695
		tx_space = pba >> 16;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2696
		/* lower 16 bits has Rx packet buffer allocation size in KB */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2697
		pba &= 0xffff;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2698
		/*
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2699
		 * the Tx fifo also stores 16 bytes of information about the tx
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2700
		 * but don't include ethernet FCS because hardware appends it
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2701
		 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2702
		min_tx_space = (adapter->max_frame_size +
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2703
				sizeof(struct e1000_tx_desc) -
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2704
				ETH_FCS_LEN) * 2;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2705
		min_tx_space = ALIGN(min_tx_space, 1024);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2706
		min_tx_space >>= 10;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2707
		/* software strips receive CRC, so leave room for it */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2708
		min_rx_space = adapter->max_frame_size;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2709
		min_rx_space = ALIGN(min_rx_space, 1024);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2710
		min_rx_space >>= 10;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2711
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2712
		/*
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2713
		 * If current Tx allocation is less than the min Tx FIFO size,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2714
		 * and the min Tx FIFO size is less than the current Rx FIFO
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2715
		 * allocation, take space away from current Rx allocation
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2716
		 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2717
		if ((tx_space < min_tx_space) &&
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2718
		    ((min_tx_space - tx_space) < pba)) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2719
			pba -= min_tx_space - tx_space;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2720
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2721
			/*
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2722
			 * if short on Rx space, Rx wins and must trump tx
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2723
			 * adjustment or use Early Receive if available
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2724
			 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2725
			if ((pba < min_rx_space) &&
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2726
			    (!(adapter->flags & FLAG_HAS_ERT)))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2727
				/* ERT enabled in e1000_configure_rx */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2728
				pba = min_rx_space;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2729
		}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2730
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2731
		ew32(PBA, pba);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2732
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2733
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2734
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2735
	/*
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2736
	 * flow control settings
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2737
	 *
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2738
	 * The high water mark must be low enough to fit one full frame
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2739
	 * (or the size used for early receive) above it in the Rx FIFO.
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2740
	 * Set it to the lower of:
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2741
	 * - 90% of the Rx FIFO size, and
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2742
	 * - the full Rx FIFO size minus the early receive size (for parts
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2743
	 *   with ERT support assuming ERT set to E1000_ERT_2048), or
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2744
	 * - the full Rx FIFO size minus one full frame
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2745
	 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2746
	if (hw->mac.type == e1000_pchlan) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2747
		/*
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2748
		 * Workaround PCH LOM adapter hangs with certain network
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2749
		 * loads.  If hangs persist, try disabling Tx flow control.
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2750
		 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2751
		if (adapter->netdev->mtu > ETH_DATA_LEN) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2752
			fc->high_water = 0x3500;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2753
			fc->low_water  = 0x1500;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2754
		} else {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2755
			fc->high_water = 0x5000;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2756
			fc->low_water  = 0x3000;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2757
		}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2758
	} else {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2759
		if ((adapter->flags & FLAG_HAS_ERT) &&
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2760
		    (adapter->netdev->mtu > ETH_DATA_LEN))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2761
			hwm = min(((pba << 10) * 9 / 10),
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2762
				  ((pba << 10) - (E1000_ERT_2048 << 3)));
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2763
		else
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2764
			hwm = min(((pba << 10) * 9 / 10),
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2765
				  ((pba << 10) - adapter->max_frame_size));
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2766
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2767
		fc->high_water = hwm & E1000_FCRTH_RTH; /* 8-byte granularity */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2768
		fc->low_water = fc->high_water - 8;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2769
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2770
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2771
	if (adapter->flags & FLAG_DISABLE_FC_PAUSE_TIME)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2772
		fc->pause_time = 0xFFFF;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2773
	else
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2774
		fc->pause_time = E1000_FC_PAUSE_TIME;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2775
	fc->send_xon = 1;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2776
	fc->current_mode = fc->requested_mode;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2777
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2778
	/* Allow time for pending master requests to run */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2779
	mac->ops.reset_hw(hw);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2780
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2781
	/*
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2782
	 * For parts with AMT enabled, let the firmware know
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2783
	 * that the network interface is in control
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2784
	 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2785
	if (adapter->flags & FLAG_HAS_AMT)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2786
		e1000_get_hw_control(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2787
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2788
	ew32(WUC, 0);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2789
	if (adapter->flags2 & FLAG2_HAS_PHY_WAKEUP)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2790
		e1e_wphy(&adapter->hw, BM_WUC, 0);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2791
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2792
	if (mac->ops.init_hw(hw))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2793
		e_err("Hardware Error\n");
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2794
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2795
	/* additional part of the flow-control workaround above */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2796
	if (hw->mac.type == e1000_pchlan)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2797
		ew32(FCRTV_PCH, 0x1000);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2798
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2799
	e1000_update_mng_vlan(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2800
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2801
	/* Enable h/w to recognize an 802.1Q VLAN Ethernet packet */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2802
	ew32(VET, ETH_P_8021Q);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2803
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2804
	e1000e_reset_adaptive(hw);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2805
	e1000_get_phy_info(hw);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2806
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2807
	if ((adapter->flags & FLAG_HAS_SMART_POWER_DOWN) &&
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2808
	    !(adapter->flags & FLAG_SMART_POWER_DOWN)) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2809
		u16 phy_data = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2810
		/*
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2811
		 * speed up time to link by disabling smart power down, ignore
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2812
		 * the return value of this function because there is nothing
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2813
		 * different we would do if it failed
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2814
		 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2815
		e1e_rphy(hw, IGP02E1000_PHY_POWER_MGMT, &phy_data);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2816
		phy_data &= ~IGP02E1000_PM_SPD;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2817
		e1e_wphy(hw, IGP02E1000_PHY_POWER_MGMT, phy_data);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2818
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2819
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2820
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2821
int e1000e_up(struct e1000_adapter *adapter)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2822
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2823
	struct e1000_hw *hw = &adapter->hw;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2824
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2825
	/* DMA latency requirement to workaround early-receive/jumbo issue */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2826
	if (adapter->flags & FLAG_HAS_ERT)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2827
		pm_qos_add_requirement(PM_QOS_CPU_DMA_LATENCY,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2828
		                       adapter->netdev->name,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2829
				       PM_QOS_DEFAULT_VALUE);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2830
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2831
	/* hardware has been reset, we need to reload some things */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2832
	e1000_configure(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2833
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2834
	clear_bit(__E1000_DOWN, &adapter->state);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2835
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2836
	napi_enable(&adapter->napi);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2837
	if (adapter->msix_entries)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2838
		e1000_configure_msix(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2839
	e1000_irq_enable(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2840
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2841
	netif_wake_queue(adapter->netdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2842
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2843
	/* fire a link change interrupt to start the watchdog */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2844
	ew32(ICS, E1000_ICS_LSC);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2845
	return 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2846
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2847
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2848
void e1000e_down(struct e1000_adapter *adapter)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2849
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2850
	struct net_device *netdev = adapter->netdev;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2851
	struct e1000_hw *hw = &adapter->hw;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2852
	u32 tctl, rctl;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2853
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2854
	/*
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2855
	 * signal that we're down so the interrupt handler does not
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2856
	 * reschedule our watchdog timer
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2857
	 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2858
	set_bit(__E1000_DOWN, &adapter->state);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2859
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2860
	/* disable receives in the hardware */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2861
	rctl = er32(RCTL);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2862
	ew32(RCTL, rctl & ~E1000_RCTL_EN);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2863
	/* flush and sleep below */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2864
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2865
	netif_stop_queue(netdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2866
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2867
	/* disable transmits in the hardware */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2868
	tctl = er32(TCTL);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2869
	tctl &= ~E1000_TCTL_EN;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2870
	ew32(TCTL, tctl);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2871
	/* flush both disables and wait for them to finish */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2872
	e1e_flush();
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2873
	msleep(10);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2874
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2875
	napi_disable(&adapter->napi);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2876
	e1000_irq_disable(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2877
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2878
	del_timer_sync(&adapter->watchdog_timer);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2879
	del_timer_sync(&adapter->phy_info_timer);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2880
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2881
	netif_carrier_off(netdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2882
	adapter->link_speed = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2883
	adapter->link_duplex = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2884
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2885
	if (!pci_channel_offline(adapter->pdev))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2886
		e1000e_reset(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2887
	e1000_clean_tx_ring(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2888
	e1000_clean_rx_ring(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2889
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2890
	if (adapter->flags & FLAG_HAS_ERT)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2891
		pm_qos_remove_requirement(PM_QOS_CPU_DMA_LATENCY,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2892
		                          adapter->netdev->name);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2893
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2894
	/*
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2895
	 * TODO: for power management, we could drop the link and
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2896
	 * pci_disable_device here.
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2897
	 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2898
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2899
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2900
void e1000e_reinit_locked(struct e1000_adapter *adapter)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2901
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2902
	might_sleep();
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2903
	while (test_and_set_bit(__E1000_RESETTING, &adapter->state))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2904
		msleep(1);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2905
	e1000e_down(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2906
	e1000e_up(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2907
	clear_bit(__E1000_RESETTING, &adapter->state);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2908
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2909
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2910
/**
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2911
 * e1000_sw_init - Initialize general software structures (struct e1000_adapter)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2912
 * @adapter: board private structure to initialize
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2913
 *
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2914
 * e1000_sw_init initializes the Adapter private data structure.
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2915
 * Fields are initialized based on PCI device information and
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2916
 * OS network device settings (MTU size).
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2917
 **/
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2918
static int __devinit e1000_sw_init(struct e1000_adapter *adapter)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2919
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2920
	struct net_device *netdev = adapter->netdev;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2921
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2922
	adapter->rx_buffer_len = ETH_FRAME_LEN + VLAN_HLEN + ETH_FCS_LEN;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2923
	adapter->rx_ps_bsize0 = 128;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2924
	adapter->max_frame_size = netdev->mtu + ETH_HLEN + ETH_FCS_LEN;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2925
	adapter->min_frame_size = ETH_ZLEN + ETH_FCS_LEN;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2926
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2927
	e1000e_set_interrupt_capability(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2928
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2929
	if (e1000_alloc_queues(adapter))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2930
		return -ENOMEM;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2931
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2932
	/* Explicitly disable IRQ since the NIC can be in any state. */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2933
	e1000_irq_disable(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2934
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2935
	set_bit(__E1000_DOWN, &adapter->state);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2936
	return 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2937
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2938
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2939
/**
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2940
 * e1000_intr_msi_test - Interrupt Handler
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2941
 * @irq: interrupt number
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2942
 * @data: pointer to a network interface device structure
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2943
 **/
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2944
static irqreturn_t e1000_intr_msi_test(int irq, void *data)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2945
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2946
	struct net_device *netdev = data;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2947
	struct e1000_adapter *adapter = netdev_priv(netdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2948
	struct e1000_hw *hw = &adapter->hw;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2949
	u32 icr = er32(ICR);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2950
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2951
	e_dbg("icr is %08X\n", icr);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2952
	if (icr & E1000_ICR_RXSEQ) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2953
		adapter->flags &= ~FLAG_MSI_TEST_FAILED;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2954
		wmb();
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2955
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2956
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2957
	return IRQ_HANDLED;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2958
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2959
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2960
/**
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2961
 * e1000_test_msi_interrupt - Returns 0 for successful test
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2962
 * @adapter: board private struct
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2963
 *
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2964
 * code flow taken from tg3.c
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2965
 **/
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2966
static int e1000_test_msi_interrupt(struct e1000_adapter *adapter)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2967
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2968
	struct net_device *netdev = adapter->netdev;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2969
	struct e1000_hw *hw = &adapter->hw;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2970
	int err;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2971
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2972
	/* poll_enable hasn't been called yet, so don't need disable */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2973
	/* clear any pending events */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2974
	er32(ICR);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2975
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2976
	/* free the real vector and request a test handler */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2977
	e1000_free_irq(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2978
	e1000e_reset_interrupt_capability(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2979
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2980
	/* Assume that the test fails, if it succeeds then the test
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2981
	 * MSI irq handler will unset this flag */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2982
	adapter->flags |= FLAG_MSI_TEST_FAILED;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2983
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2984
	err = pci_enable_msi(adapter->pdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2985
	if (err)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2986
		goto msi_test_failed;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2987
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2988
	err = request_irq(adapter->pdev->irq, e1000_intr_msi_test, 0,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2989
			  netdev->name, netdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2990
	if (err) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2991
		pci_disable_msi(adapter->pdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2992
		goto msi_test_failed;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2993
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2994
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2995
	wmb();
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2996
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2997
	e1000_irq_enable(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2998
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2999
	/* fire an unusual interrupt on the test handler */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3000
	ew32(ICS, E1000_ICS_RXSEQ);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3001
	e1e_flush();
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3002
	msleep(50);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3003
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3004
	e1000_irq_disable(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3005
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3006
	rmb();
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3007
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3008
	if (adapter->flags & FLAG_MSI_TEST_FAILED) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3009
		adapter->int_mode = E1000E_INT_MODE_LEGACY;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3010
		err = -EIO;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3011
		e_info("MSI interrupt test failed!\n");
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3012
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3013
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3014
	free_irq(adapter->pdev->irq, netdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3015
	pci_disable_msi(adapter->pdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3016
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3017
	if (err == -EIO)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3018
		goto msi_test_failed;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3019
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3020
	/* okay so the test worked, restore settings */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3021
	e_dbg("MSI interrupt test succeeded!\n");
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3022
msi_test_failed:
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3023
	e1000e_set_interrupt_capability(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3024
	e1000_request_irq(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3025
	return err;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3026
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3027
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3028
/**
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3029
 * e1000_test_msi - Returns 0 if MSI test succeeds or INTx mode is restored
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3030
 * @adapter: board private struct
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3031
 *
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3032
 * code flow taken from tg3.c, called with e1000 interrupts disabled.
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3033
 **/
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3034
static int e1000_test_msi(struct e1000_adapter *adapter)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3035
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3036
	int err;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3037
	u16 pci_cmd;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3038
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3039
	if (!(adapter->flags & FLAG_MSI_ENABLED))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3040
		return 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3041
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3042
	/* disable SERR in case the MSI write causes a master abort */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3043
	pci_read_config_word(adapter->pdev, PCI_COMMAND, &pci_cmd);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3044
	pci_write_config_word(adapter->pdev, PCI_COMMAND,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3045
			      pci_cmd & ~PCI_COMMAND_SERR);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3046
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3047
	err = e1000_test_msi_interrupt(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3048
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3049
	/* restore previous setting of command word */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3050
	pci_write_config_word(adapter->pdev, PCI_COMMAND, pci_cmd);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3051
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3052
	/* success ! */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3053
	if (!err)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3054
		return 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3055
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3056
	/* EIO means MSI test failed */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3057
	if (err != -EIO)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3058
		return err;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3059
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3060
	/* back to INTx mode */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3061
	e_warn("MSI interrupt test failed, using legacy interrupt.\n");
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3062
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3063
	e1000_free_irq(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3064
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3065
	err = e1000_request_irq(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3066
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3067
	return err;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3068
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3069
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3070
/**
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3071
 * e1000_open - Called when a network interface is made active
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3072
 * @netdev: network interface device structure
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3073
 *
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3074
 * Returns 0 on success, negative value on failure
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3075
 *
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3076
 * The open entry point is called when a network interface is made
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3077
 * active by the system (IFF_UP).  At this point all resources needed
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3078
 * for transmit and receive operations are allocated, the interrupt
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3079
 * handler is registered with the OS, the watchdog timer is started,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3080
 * and the stack is notified that the interface is ready.
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3081
 **/
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3082
static int e1000_open(struct net_device *netdev)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3083
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3084
	struct e1000_adapter *adapter = netdev_priv(netdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3085
	struct e1000_hw *hw = &adapter->hw;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3086
	int err;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3087
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3088
	/* disallow open during test */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3089
	if (test_bit(__E1000_TESTING, &adapter->state))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3090
		return -EBUSY;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3091
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3092
	netif_carrier_off(netdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3093
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3094
	/* allocate transmit descriptors */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3095
	err = e1000e_setup_tx_resources(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3096
	if (err)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3097
		goto err_setup_tx;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3098
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3099
	/* allocate receive descriptors */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3100
	err = e1000e_setup_rx_resources(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3101
	if (err)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3102
		goto err_setup_rx;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3103
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3104
	e1000e_power_up_phy(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3105
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3106
	adapter->mng_vlan_id = E1000_MNG_VLAN_NONE;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3107
	if ((adapter->hw.mng_cookie.status &
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3108
	     E1000_MNG_DHCP_COOKIE_STATUS_VLAN))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3109
		e1000_update_mng_vlan(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3110
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3111
	/*
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3112
	 * If AMT is enabled, let the firmware know that the network
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3113
	 * interface is now open
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3114
	 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3115
	if (adapter->flags & FLAG_HAS_AMT)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3116
		e1000_get_hw_control(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3117
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3118
	/*
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3119
	 * before we allocate an interrupt, we must be ready to handle it.
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3120
	 * Setting DEBUG_SHIRQ in the kernel makes it fire an interrupt
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3121
	 * as soon as we call pci_request_irq, so we have to setup our
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3122
	 * clean_rx handler before we do so.
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3123
	 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3124
	e1000_configure(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3125
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3126
	err = e1000_request_irq(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3127
	if (err)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3128
		goto err_req_irq;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3129
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3130
	/*
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3131
	 * Work around PCIe errata with MSI interrupts causing some chipsets to
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3132
	 * ignore e1000e MSI messages, which means we need to test our MSI
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3133
	 * interrupt now
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3134
	 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3135
	if (adapter->int_mode != E1000E_INT_MODE_LEGACY) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3136
		err = e1000_test_msi(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3137
		if (err) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3138
			e_err("Interrupt allocation failed\n");
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3139
			goto err_req_irq;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3140
		}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3141
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3142
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3143
	/* From here on the code is the same as e1000e_up() */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3144
	clear_bit(__E1000_DOWN, &adapter->state);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3145
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3146
	napi_enable(&adapter->napi);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3147
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3148
	e1000_irq_enable(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3149
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3150
	netif_start_queue(netdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3151
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3152
	/* fire a link status change interrupt to start the watchdog */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3153
	ew32(ICS, E1000_ICS_LSC);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3154
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3155
	return 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3156
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3157
err_req_irq:
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3158
	e1000_release_hw_control(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3159
	e1000_power_down_phy(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3160
	e1000e_free_rx_resources(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3161
err_setup_rx:
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3162
	e1000e_free_tx_resources(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3163
err_setup_tx:
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3164
	e1000e_reset(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3165
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3166
	return err;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3167
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3168
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3169
/**
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3170
 * e1000_close - Disables a network interface
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3171
 * @netdev: network interface device structure
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3172
 *
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3173
 * Returns 0, this is not allowed to fail
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3174
 *
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3175
 * The close entry point is called when an interface is de-activated
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3176
 * by the OS.  The hardware is still under the drivers control, but
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3177
 * needs to be disabled.  A global MAC reset is issued to stop the
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3178
 * hardware, and all transmit and receive resources are freed.
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3179
 **/
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3180
static int e1000_close(struct net_device *netdev)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3181
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3182
	struct e1000_adapter *adapter = netdev_priv(netdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3183
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3184
	WARN_ON(test_bit(__E1000_RESETTING, &adapter->state));
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3185
	e1000e_down(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3186
	e1000_power_down_phy(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3187
	e1000_free_irq(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3188
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3189
	e1000e_free_tx_resources(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3190
	e1000e_free_rx_resources(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3191
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3192
	/*
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3193
	 * kill manageability vlan ID if supported, but not if a vlan with
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3194
	 * the same ID is registered on the host OS (let 8021q kill it)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3195
	 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3196
	if ((adapter->hw.mng_cookie.status &
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3197
			  E1000_MNG_DHCP_COOKIE_STATUS_VLAN) &&
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3198
	     !(adapter->vlgrp &&
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3199
	       vlan_group_get_device(adapter->vlgrp, adapter->mng_vlan_id)))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3200
		e1000_vlan_rx_kill_vid(netdev, adapter->mng_vlan_id);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3201
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3202
	/*
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3203
	 * If AMT is enabled, let the firmware know that the network
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3204
	 * interface is now closed
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3205
	 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3206
	if (adapter->flags & FLAG_HAS_AMT)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3207
		e1000_release_hw_control(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3208
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3209
	return 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3210
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3211
/**
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3212
 * e1000_set_mac - Change the Ethernet Address of the NIC
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3213
 * @netdev: network interface device structure
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3214
 * @p: pointer to an address structure
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3215
 *
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3216
 * Returns 0 on success, negative on failure
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3217
 **/
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3218
static int e1000_set_mac(struct net_device *netdev, void *p)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3219
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3220
	struct e1000_adapter *adapter = netdev_priv(netdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3221
	struct sockaddr *addr = p;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3222
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3223
	if (!is_valid_ether_addr(addr->sa_data))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3224
		return -EADDRNOTAVAIL;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3225
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3226
	memcpy(netdev->dev_addr, addr->sa_data, netdev->addr_len);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3227
	memcpy(adapter->hw.mac.addr, addr->sa_data, netdev->addr_len);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3228
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3229
	e1000e_rar_set(&adapter->hw, adapter->hw.mac.addr, 0);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3230
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3231
	if (adapter->flags & FLAG_RESET_OVERWRITES_LAA) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3232
		/* activate the work around */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3233
		e1000e_set_laa_state_82571(&adapter->hw, 1);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3234
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3235
		/*
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3236
		 * Hold a copy of the LAA in RAR[14] This is done so that
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3237
		 * between the time RAR[0] gets clobbered  and the time it
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3238
		 * gets fixed (in e1000_watchdog), the actual LAA is in one
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3239
		 * of the RARs and no incoming packets directed to this port
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3240
		 * are dropped. Eventually the LAA will be in RAR[0] and
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3241
		 * RAR[14]
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3242
		 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3243
		e1000e_rar_set(&adapter->hw,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3244
			      adapter->hw.mac.addr,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3245
			      adapter->hw.mac.rar_entry_count - 1);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3246
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3247
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3248
	return 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3249
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3250
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3251
/**
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3252
 * e1000e_update_phy_task - work thread to update phy
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3253
 * @work: pointer to our work struct
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3254
 *
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3255
 * this worker thread exists because we must acquire a
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3256
 * semaphore to read the phy, which we could msleep while
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3257
 * waiting for it, and we can't msleep in a timer.
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3258
 **/
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3259
static void e1000e_update_phy_task(struct work_struct *work)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3260
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3261
	struct e1000_adapter *adapter = container_of(work,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3262
					struct e1000_adapter, update_phy_task);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3263
	e1000_get_phy_info(&adapter->hw);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3264
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3265
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3266
/*
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3267
 * Need to wait a few seconds after link up to get diagnostic information from
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3268
 * the phy
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3269
 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3270
static void e1000_update_phy_info(unsigned long data)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3271
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3272
	struct e1000_adapter *adapter = (struct e1000_adapter *) data;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3273
	schedule_work(&adapter->update_phy_task);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3274
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3275
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3276
/**
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3277
 * e1000e_update_stats - Update the board statistics counters
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3278
 * @adapter: board private structure
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3279
 **/
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3280
void e1000e_update_stats(struct e1000_adapter *adapter)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3281
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3282
	struct net_device *netdev = adapter->netdev;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3283
	struct e1000_hw *hw = &adapter->hw;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3284
	struct pci_dev *pdev = adapter->pdev;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3285
	u16 phy_data;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3286
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3287
	/*
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3288
	 * Prevent stats update while adapter is being reset, or if the pci
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3289
	 * connection is down.
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3290
	 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3291
	if (adapter->link_speed == 0)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3292
		return;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3293
	if (pci_channel_offline(pdev))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3294
		return;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3295
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3296
	adapter->stats.crcerrs += er32(CRCERRS);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3297
	adapter->stats.gprc += er32(GPRC);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3298
	adapter->stats.gorc += er32(GORCL);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3299
	er32(GORCH); /* Clear gorc */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3300
	adapter->stats.bprc += er32(BPRC);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3301
	adapter->stats.mprc += er32(MPRC);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3302
	adapter->stats.roc += er32(ROC);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3303
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3304
	adapter->stats.mpc += er32(MPC);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3305
	if ((hw->phy.type == e1000_phy_82578) ||
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3306
	    (hw->phy.type == e1000_phy_82577)) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3307
		e1e_rphy(hw, HV_SCC_UPPER, &phy_data);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3308
		if (!e1e_rphy(hw, HV_SCC_LOWER, &phy_data))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3309
			adapter->stats.scc += phy_data;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3310
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3311
		e1e_rphy(hw, HV_ECOL_UPPER, &phy_data);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3312
		if (!e1e_rphy(hw, HV_ECOL_LOWER, &phy_data))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3313
			adapter->stats.ecol += phy_data;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3314
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3315
		e1e_rphy(hw, HV_MCC_UPPER, &phy_data);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3316
		if (!e1e_rphy(hw, HV_MCC_LOWER, &phy_data))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3317
			adapter->stats.mcc += phy_data;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3318
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3319
		e1e_rphy(hw, HV_LATECOL_UPPER, &phy_data);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3320
		if (!e1e_rphy(hw, HV_LATECOL_LOWER, &phy_data))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3321
			adapter->stats.latecol += phy_data;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3322
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3323
		e1e_rphy(hw, HV_DC_UPPER, &phy_data);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3324
		if (!e1e_rphy(hw, HV_DC_LOWER, &phy_data))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3325
			adapter->stats.dc += phy_data;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3326
	} else {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3327
		adapter->stats.scc += er32(SCC);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3328
		adapter->stats.ecol += er32(ECOL);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3329
		adapter->stats.mcc += er32(MCC);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3330
		adapter->stats.latecol += er32(LATECOL);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3331
		adapter->stats.dc += er32(DC);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3332
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3333
	adapter->stats.xonrxc += er32(XONRXC);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3334
	adapter->stats.xontxc += er32(XONTXC);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3335
	adapter->stats.xoffrxc += er32(XOFFRXC);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3336
	adapter->stats.xofftxc += er32(XOFFTXC);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3337
	adapter->stats.gptc += er32(GPTC);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3338
	adapter->stats.gotc += er32(GOTCL);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3339
	er32(GOTCH); /* Clear gotc */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3340
	adapter->stats.rnbc += er32(RNBC);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3341
	adapter->stats.ruc += er32(RUC);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3342
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3343
	adapter->stats.mptc += er32(MPTC);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3344
	adapter->stats.bptc += er32(BPTC);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3345
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3346
	/* used for adaptive IFS */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3347
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3348
	hw->mac.tx_packet_delta = er32(TPT);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3349
	adapter->stats.tpt += hw->mac.tx_packet_delta;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3350
	if ((hw->phy.type == e1000_phy_82578) ||
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3351
	    (hw->phy.type == e1000_phy_82577)) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3352
		e1e_rphy(hw, HV_COLC_UPPER, &phy_data);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3353
		if (!e1e_rphy(hw, HV_COLC_LOWER, &phy_data))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3354
			hw->mac.collision_delta = phy_data;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3355
	} else {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3356
		hw->mac.collision_delta = er32(COLC);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3357
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3358
	adapter->stats.colc += hw->mac.collision_delta;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3359
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3360
	adapter->stats.algnerrc += er32(ALGNERRC);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3361
	adapter->stats.rxerrc += er32(RXERRC);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3362
	if ((hw->phy.type == e1000_phy_82578) ||
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3363
	    (hw->phy.type == e1000_phy_82577)) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3364
		e1e_rphy(hw, HV_TNCRS_UPPER, &phy_data);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3365
		if (!e1e_rphy(hw, HV_TNCRS_LOWER, &phy_data))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3366
			adapter->stats.tncrs += phy_data;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3367
	} else {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3368
		if ((hw->mac.type != e1000_82574) &&
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3369
		    (hw->mac.type != e1000_82583))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3370
			adapter->stats.tncrs += er32(TNCRS);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3371
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3372
	adapter->stats.cexterr += er32(CEXTERR);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3373
	adapter->stats.tsctc += er32(TSCTC);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3374
	adapter->stats.tsctfc += er32(TSCTFC);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3375
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3376
	/* Fill out the OS statistics structure */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3377
	netdev->stats.multicast = adapter->stats.mprc;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3378
	netdev->stats.collisions = adapter->stats.colc;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3379
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3380
	/* Rx Errors */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3381
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3382
	/*
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3383
	 * RLEC on some newer hardware can be incorrect so build
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3384
	 * our own version based on RUC and ROC
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3385
	 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3386
	netdev->stats.rx_errors = adapter->stats.rxerrc +
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3387
		adapter->stats.crcerrs + adapter->stats.algnerrc +
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3388
		adapter->stats.ruc + adapter->stats.roc +
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3389
		adapter->stats.cexterr;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3390
	netdev->stats.rx_length_errors = adapter->stats.ruc +
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3391
					      adapter->stats.roc;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3392
	netdev->stats.rx_crc_errors = adapter->stats.crcerrs;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3393
	netdev->stats.rx_frame_errors = adapter->stats.algnerrc;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3394
	netdev->stats.rx_missed_errors = adapter->stats.mpc;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3395
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3396
	/* Tx Errors */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3397
	netdev->stats.tx_errors = adapter->stats.ecol +
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3398
				       adapter->stats.latecol;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3399
	netdev->stats.tx_aborted_errors = adapter->stats.ecol;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3400
	netdev->stats.tx_window_errors = adapter->stats.latecol;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3401
	netdev->stats.tx_carrier_errors = adapter->stats.tncrs;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3402
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3403
	/* Tx Dropped needs to be maintained elsewhere */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3404
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3405
	/* Management Stats */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3406
	adapter->stats.mgptc += er32(MGTPTC);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3407
	adapter->stats.mgprc += er32(MGTPRC);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3408
	adapter->stats.mgpdc += er32(MGTPDC);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3409
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3410
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3411
/**
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3412
 * e1000_phy_read_status - Update the PHY register status snapshot
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3413
 * @adapter: board private structure
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3414
 **/
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3415
static void e1000_phy_read_status(struct e1000_adapter *adapter)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3416
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3417
	struct e1000_hw *hw = &adapter->hw;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3418
	struct e1000_phy_regs *phy = &adapter->phy_regs;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3419
	int ret_val;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3420
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3421
	if ((er32(STATUS) & E1000_STATUS_LU) &&
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3422
	    (adapter->hw.phy.media_type == e1000_media_type_copper)) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3423
		ret_val  = e1e_rphy(hw, PHY_CONTROL, &phy->bmcr);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3424
		ret_val |= e1e_rphy(hw, PHY_STATUS, &phy->bmsr);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3425
		ret_val |= e1e_rphy(hw, PHY_AUTONEG_ADV, &phy->advertise);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3426
		ret_val |= e1e_rphy(hw, PHY_LP_ABILITY, &phy->lpa);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3427
		ret_val |= e1e_rphy(hw, PHY_AUTONEG_EXP, &phy->expansion);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3428
		ret_val |= e1e_rphy(hw, PHY_1000T_CTRL, &phy->ctrl1000);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3429
		ret_val |= e1e_rphy(hw, PHY_1000T_STATUS, &phy->stat1000);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3430
		ret_val |= e1e_rphy(hw, PHY_EXT_STATUS, &phy->estatus);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3431
		if (ret_val)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3432
			e_warn("Error reading PHY register\n");
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3433
	} else {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3434
		/*
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3435
		 * Do not read PHY registers if link is not up
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3436
		 * Set values to typical power-on defaults
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3437
		 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3438
		phy->bmcr = (BMCR_SPEED1000 | BMCR_ANENABLE | BMCR_FULLDPLX);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3439
		phy->bmsr = (BMSR_100FULL | BMSR_100HALF | BMSR_10FULL |
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3440
			     BMSR_10HALF | BMSR_ESTATEN | BMSR_ANEGCAPABLE |
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3441
			     BMSR_ERCAP);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3442
		phy->advertise = (ADVERTISE_PAUSE_ASYM | ADVERTISE_PAUSE_CAP |
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3443
				  ADVERTISE_ALL | ADVERTISE_CSMA);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3444
		phy->lpa = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3445
		phy->expansion = EXPANSION_ENABLENPAGE;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3446
		phy->ctrl1000 = ADVERTISE_1000FULL;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3447
		phy->stat1000 = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3448
		phy->estatus = (ESTATUS_1000_TFULL | ESTATUS_1000_THALF);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3449
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3450
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3451
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3452
static void e1000_print_link_info(struct e1000_adapter *adapter)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3453
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3454
	struct e1000_hw *hw = &adapter->hw;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3455
	u32 ctrl = er32(CTRL);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3456
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3457
	/* Link status message must follow this format for user tools */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3458
	printk(KERN_INFO "e1000e: %s NIC Link is Up %d Mbps %s, "
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3459
	       "Flow Control: %s\n",
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3460
	       adapter->netdev->name,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3461
	       adapter->link_speed,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3462
	       (adapter->link_duplex == FULL_DUPLEX) ?
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3463
	                        "Full Duplex" : "Half Duplex",
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3464
	       ((ctrl & E1000_CTRL_TFCE) && (ctrl & E1000_CTRL_RFCE)) ?
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3465
	                        "RX/TX" :
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3466
	       ((ctrl & E1000_CTRL_RFCE) ? "RX" :
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3467
	       ((ctrl & E1000_CTRL_TFCE) ? "TX" : "None" )));
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3468
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3469
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3470
bool e1000e_has_link(struct e1000_adapter *adapter)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3471
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3472
	struct e1000_hw *hw = &adapter->hw;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3473
	bool link_active = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3474
	s32 ret_val = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3475
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3476
	/*
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3477
	 * get_link_status is set on LSC (link status) interrupt or
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3478
	 * Rx sequence error interrupt.  get_link_status will stay
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3479
	 * false until the check_for_link establishes link
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3480
	 * for copper adapters ONLY
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3481
	 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3482
	switch (hw->phy.media_type) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3483
	case e1000_media_type_copper:
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3484
		if (hw->mac.get_link_status) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3485
			ret_val = hw->mac.ops.check_for_link(hw);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3486
			link_active = !hw->mac.get_link_status;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3487
		} else {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3488
			link_active = 1;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3489
		}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3490
		break;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3491
	case e1000_media_type_fiber:
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3492
		ret_val = hw->mac.ops.check_for_link(hw);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3493
		link_active = !!(er32(STATUS) & E1000_STATUS_LU);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3494
		break;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3495
	case e1000_media_type_internal_serdes:
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3496
		ret_val = hw->mac.ops.check_for_link(hw);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3497
		link_active = adapter->hw.mac.serdes_has_link;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3498
		break;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3499
	default:
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3500
	case e1000_media_type_unknown:
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3501
		break;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3502
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3503
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3504
	if ((ret_val == E1000_ERR_PHY) && (hw->phy.type == e1000_phy_igp_3) &&
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3505
	    (er32(CTRL) & E1000_PHY_CTRL_GBE_DISABLE)) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3506
		/* See e1000_kmrn_lock_loss_workaround_ich8lan() */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3507
		e_info("Gigabit has been disabled, downgrading speed\n");
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3508
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3509
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3510
	return link_active;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3511
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3512
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3513
static void e1000e_enable_receives(struct e1000_adapter *adapter)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3514
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3515
	/* make sure the receive unit is started */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3516
	if ((adapter->flags & FLAG_RX_NEEDS_RESTART) &&
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3517
	    (adapter->flags & FLAG_RX_RESTART_NOW)) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3518
		struct e1000_hw *hw = &adapter->hw;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3519
		u32 rctl = er32(RCTL);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3520
		ew32(RCTL, rctl | E1000_RCTL_EN);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3521
		adapter->flags &= ~FLAG_RX_RESTART_NOW;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3522
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3523
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3524
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3525
/**
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3526
 * e1000_watchdog - Timer Call-back
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3527
 * @data: pointer to adapter cast into an unsigned long
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3528
 **/
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3529
static void e1000_watchdog(unsigned long data)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3530
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3531
	struct e1000_adapter *adapter = (struct e1000_adapter *) data;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3532
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3533
	/* Do the rest outside of interrupt context */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3534
	schedule_work(&adapter->watchdog_task);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3535
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3536
	/* TODO: make this use queue_delayed_work() */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3537
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3538
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3539
static void e1000_watchdog_task(struct work_struct *work)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3540
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3541
	struct e1000_adapter *adapter = container_of(work,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3542
					struct e1000_adapter, watchdog_task);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3543
	struct net_device *netdev = adapter->netdev;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3544
	struct e1000_mac_info *mac = &adapter->hw.mac;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3545
	struct e1000_phy_info *phy = &adapter->hw.phy;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3546
	struct e1000_ring *tx_ring = adapter->tx_ring;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3547
	struct e1000_hw *hw = &adapter->hw;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3548
	u32 link, tctl;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3549
	int tx_pending = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3550
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3551
	link = e1000e_has_link(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3552
	if ((netif_carrier_ok(netdev)) && link) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3553
		e1000e_enable_receives(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3554
		goto link_up;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3555
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3556
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3557
	if ((e1000e_enable_tx_pkt_filtering(hw)) &&
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3558
	    (adapter->mng_vlan_id != adapter->hw.mng_cookie.vlan_id))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3559
		e1000_update_mng_vlan(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3560
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3561
	if (link) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3562
		if (!netif_carrier_ok(netdev)) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3563
			bool txb2b = 1;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3564
			/* update snapshot of PHY registers on LSC */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3565
			e1000_phy_read_status(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3566
			mac->ops.get_link_up_info(&adapter->hw,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3567
						   &adapter->link_speed,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3568
						   &adapter->link_duplex);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3569
			e1000_print_link_info(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3570
			/*
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3571
			 * On supported PHYs, check for duplex mismatch only
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3572
			 * if link has autonegotiated at 10/100 half
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3573
			 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3574
			if ((hw->phy.type == e1000_phy_igp_3 ||
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3575
			     hw->phy.type == e1000_phy_bm) &&
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3576
			    (hw->mac.autoneg == true) &&
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3577
			    (adapter->link_speed == SPEED_10 ||
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3578
			     adapter->link_speed == SPEED_100) &&
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3579
			    (adapter->link_duplex == HALF_DUPLEX)) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3580
				u16 autoneg_exp;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3581
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3582
				e1e_rphy(hw, PHY_AUTONEG_EXP, &autoneg_exp);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3583
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3584
				if (!(autoneg_exp & NWAY_ER_LP_NWAY_CAPS))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3585
					e_info("Autonegotiated half duplex but"
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3586
					       " link partner cannot autoneg. "
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3587
					       " Try forcing full duplex if "
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3588
					       "link gets many collisions.\n");
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3589
			}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3590
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3591
			/* adjust timeout factor according to speed/duplex */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3592
			adapter->tx_timeout_factor = 1;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3593
			switch (adapter->link_speed) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3594
			case SPEED_10:
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3595
				txb2b = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3596
				adapter->tx_timeout_factor = 16;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3597
				break;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3598
			case SPEED_100:
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3599
				txb2b = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3600
				adapter->tx_timeout_factor = 10;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3601
				break;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3602
			}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3603
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3604
			/*
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3605
			 * workaround: re-program speed mode bit after
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3606
			 * link-up event
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3607
			 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3608
			if ((adapter->flags & FLAG_TARC_SPEED_MODE_BIT) &&
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3609
			    !txb2b) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3610
				u32 tarc0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3611
				tarc0 = er32(TARC(0));
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3612
				tarc0 &= ~SPEED_MODE_BIT;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3613
				ew32(TARC(0), tarc0);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3614
			}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3615
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3616
			/*
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3617
			 * disable TSO for pcie and 10/100 speeds, to avoid
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3618
			 * some hardware issues
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3619
			 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3620
			if (!(adapter->flags & FLAG_TSO_FORCE)) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3621
				switch (adapter->link_speed) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3622
				case SPEED_10:
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3623
				case SPEED_100:
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3624
					e_info("10/100 speed: disabling TSO\n");
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3625
					netdev->features &= ~NETIF_F_TSO;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3626
					netdev->features &= ~NETIF_F_TSO6;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3627
					break;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3628
				case SPEED_1000:
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3629
					netdev->features |= NETIF_F_TSO;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3630
					netdev->features |= NETIF_F_TSO6;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3631
					break;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3632
				default:
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3633
					/* oops */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3634
					break;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3635
				}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3636
			}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3637
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3638
			/*
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3639
			 * enable transmits in the hardware, need to do this
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3640
			 * after setting TARC(0)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3641
			 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3642
			tctl = er32(TCTL);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3643
			tctl |= E1000_TCTL_EN;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3644
			ew32(TCTL, tctl);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3645
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3646
                        /*
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3647
			 * Perform any post-link-up configuration before
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3648
			 * reporting link up.
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3649
			 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3650
			if (phy->ops.cfg_on_link_up)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3651
				phy->ops.cfg_on_link_up(hw);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3652
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3653
			netif_carrier_on(netdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3654
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3655
			if (!test_bit(__E1000_DOWN, &adapter->state))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3656
				mod_timer(&adapter->phy_info_timer,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3657
					  round_jiffies(jiffies + 2 * HZ));
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3658
		}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3659
	} else {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3660
		if (netif_carrier_ok(netdev)) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3661
			adapter->link_speed = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3662
			adapter->link_duplex = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3663
			/* Link status message must follow this format */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3664
			printk(KERN_INFO "e1000e: %s NIC Link is Down\n",
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3665
			       adapter->netdev->name);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3666
			netif_carrier_off(netdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3667
			if (!test_bit(__E1000_DOWN, &adapter->state))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3668
				mod_timer(&adapter->phy_info_timer,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3669
					  round_jiffies(jiffies + 2 * HZ));
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3670
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3671
			if (adapter->flags & FLAG_RX_NEEDS_RESTART)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3672
				schedule_work(&adapter->reset_task);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3673
		}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3674
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3675
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3676
link_up:
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3677
	e1000e_update_stats(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3678
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3679
	mac->tx_packet_delta = adapter->stats.tpt - adapter->tpt_old;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3680
	adapter->tpt_old = adapter->stats.tpt;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3681
	mac->collision_delta = adapter->stats.colc - adapter->colc_old;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3682
	adapter->colc_old = adapter->stats.colc;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3683
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3684
	adapter->gorc = adapter->stats.gorc - adapter->gorc_old;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3685
	adapter->gorc_old = adapter->stats.gorc;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3686
	adapter->gotc = adapter->stats.gotc - adapter->gotc_old;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3687
	adapter->gotc_old = adapter->stats.gotc;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3688
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3689
	e1000e_update_adaptive(&adapter->hw);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3690
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3691
	if (!netif_carrier_ok(netdev)) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3692
		tx_pending = (e1000_desc_unused(tx_ring) + 1 <
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3693
			       tx_ring->count);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3694
		if (tx_pending) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3695
			/*
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3696
			 * We've lost link, so the controller stops DMA,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3697
			 * but we've got queued Tx work that's never going
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3698
			 * to get done, so reset controller to flush Tx.
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3699
			 * (Do the reset outside of interrupt context).
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3700
			 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3701
			adapter->tx_timeout_count++;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3702
			schedule_work(&adapter->reset_task);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3703
			/* return immediately since reset is imminent */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3704
			return;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3705
		}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3706
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3707
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3708
	/* Cause software interrupt to ensure Rx ring is cleaned */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3709
	if (adapter->msix_entries)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3710
		ew32(ICS, adapter->rx_ring->ims_val);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3711
	else
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3712
		ew32(ICS, E1000_ICS_RXDMT0);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3713
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3714
	/* Force detection of hung controller every watchdog period */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3715
	adapter->detect_tx_hung = 1;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3716
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3717
	/*
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3718
	 * With 82571 controllers, LAA may be overwritten due to controller
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3719
	 * reset from the other port. Set the appropriate LAA in RAR[0]
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3720
	 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3721
	if (e1000e_get_laa_state_82571(hw))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3722
		e1000e_rar_set(hw, adapter->hw.mac.addr, 0);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3723
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3724
	/* Reset the timer */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3725
	if (!test_bit(__E1000_DOWN, &adapter->state))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3726
		mod_timer(&adapter->watchdog_timer,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3727
			  round_jiffies(jiffies + 2 * HZ));
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3728
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3729
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3730
#define E1000_TX_FLAGS_CSUM		0x00000001
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3731
#define E1000_TX_FLAGS_VLAN		0x00000002
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3732
#define E1000_TX_FLAGS_TSO		0x00000004
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3733
#define E1000_TX_FLAGS_IPV4		0x00000008
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3734
#define E1000_TX_FLAGS_VLAN_MASK	0xffff0000
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3735
#define E1000_TX_FLAGS_VLAN_SHIFT	16
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3736
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3737
static int e1000_tso(struct e1000_adapter *adapter,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3738
		     struct sk_buff *skb)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3739
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3740
	struct e1000_ring *tx_ring = adapter->tx_ring;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3741
	struct e1000_context_desc *context_desc;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3742
	struct e1000_buffer *buffer_info;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3743
	unsigned int i;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3744
	u32 cmd_length = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3745
	u16 ipcse = 0, tucse, mss;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3746
	u8 ipcss, ipcso, tucss, tucso, hdr_len;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3747
	int err;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3748
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3749
	if (!skb_is_gso(skb))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3750
		return 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3751
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3752
	if (skb_header_cloned(skb)) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3753
		err = pskb_expand_head(skb, 0, 0, GFP_ATOMIC);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3754
		if (err)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3755
			return err;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3756
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3757
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3758
	hdr_len = skb_transport_offset(skb) + tcp_hdrlen(skb);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3759
	mss = skb_shinfo(skb)->gso_size;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3760
	if (skb->protocol == htons(ETH_P_IP)) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3761
		struct iphdr *iph = ip_hdr(skb);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3762
		iph->tot_len = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3763
		iph->check = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3764
		tcp_hdr(skb)->check = ~csum_tcpudp_magic(iph->saddr, iph->daddr,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3765
		                                         0, IPPROTO_TCP, 0);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3766
		cmd_length = E1000_TXD_CMD_IP;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3767
		ipcse = skb_transport_offset(skb) - 1;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3768
	} else if (skb_is_gso_v6(skb)) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3769
		ipv6_hdr(skb)->payload_len = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3770
		tcp_hdr(skb)->check = ~csum_ipv6_magic(&ipv6_hdr(skb)->saddr,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3771
		                                       &ipv6_hdr(skb)->daddr,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3772
		                                       0, IPPROTO_TCP, 0);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3773
		ipcse = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3774
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3775
	ipcss = skb_network_offset(skb);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3776
	ipcso = (void *)&(ip_hdr(skb)->check) - (void *)skb->data;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3777
	tucss = skb_transport_offset(skb);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3778
	tucso = (void *)&(tcp_hdr(skb)->check) - (void *)skb->data;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3779
	tucse = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3780
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3781
	cmd_length |= (E1000_TXD_CMD_DEXT | E1000_TXD_CMD_TSE |
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3782
	               E1000_TXD_CMD_TCP | (skb->len - (hdr_len)));
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3783
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3784
	i = tx_ring->next_to_use;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3785
	context_desc = E1000_CONTEXT_DESC(*tx_ring, i);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3786
	buffer_info = &tx_ring->buffer_info[i];
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3787
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3788
	context_desc->lower_setup.ip_fields.ipcss  = ipcss;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3789
	context_desc->lower_setup.ip_fields.ipcso  = ipcso;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3790
	context_desc->lower_setup.ip_fields.ipcse  = cpu_to_le16(ipcse);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3791
	context_desc->upper_setup.tcp_fields.tucss = tucss;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3792
	context_desc->upper_setup.tcp_fields.tucso = tucso;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3793
	context_desc->upper_setup.tcp_fields.tucse = cpu_to_le16(tucse);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3794
	context_desc->tcp_seg_setup.fields.mss     = cpu_to_le16(mss);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3795
	context_desc->tcp_seg_setup.fields.hdr_len = hdr_len;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3796
	context_desc->cmd_and_length = cpu_to_le32(cmd_length);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3797
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3798
	buffer_info->time_stamp = jiffies;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3799
	buffer_info->next_to_watch = i;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3800
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3801
	i++;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3802
	if (i == tx_ring->count)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3803
		i = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3804
	tx_ring->next_to_use = i;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3805
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3806
	return 1;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3807
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3808
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3809
static bool e1000_tx_csum(struct e1000_adapter *adapter, struct sk_buff *skb)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3810
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3811
	struct e1000_ring *tx_ring = adapter->tx_ring;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3812
	struct e1000_context_desc *context_desc;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3813
	struct e1000_buffer *buffer_info;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3814
	unsigned int i;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3815
	u8 css;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3816
	u32 cmd_len = E1000_TXD_CMD_DEXT;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3817
	__be16 protocol;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3818
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3819
	if (skb->ip_summed != CHECKSUM_PARTIAL)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3820
		return 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3821
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3822
	if (skb->protocol == cpu_to_be16(ETH_P_8021Q))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3823
		protocol = vlan_eth_hdr(skb)->h_vlan_encapsulated_proto;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3824
	else
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3825
		protocol = skb->protocol;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3826
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3827
	switch (protocol) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3828
	case cpu_to_be16(ETH_P_IP):
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3829
		if (ip_hdr(skb)->protocol == IPPROTO_TCP)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3830
			cmd_len |= E1000_TXD_CMD_TCP;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3831
		break;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3832
	case cpu_to_be16(ETH_P_IPV6):
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3833
		/* XXX not handling all IPV6 headers */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3834
		if (ipv6_hdr(skb)->nexthdr == IPPROTO_TCP)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3835
			cmd_len |= E1000_TXD_CMD_TCP;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3836
		break;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3837
	default:
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3838
		if (unlikely(net_ratelimit()))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3839
			e_warn("checksum_partial proto=%x!\n",
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3840
			       be16_to_cpu(protocol));
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3841
		break;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3842
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3843
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3844
	css = skb_transport_offset(skb);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3845
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3846
	i = tx_ring->next_to_use;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3847
	buffer_info = &tx_ring->buffer_info[i];
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3848
	context_desc = E1000_CONTEXT_DESC(*tx_ring, i);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3849
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3850
	context_desc->lower_setup.ip_config = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3851
	context_desc->upper_setup.tcp_fields.tucss = css;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3852
	context_desc->upper_setup.tcp_fields.tucso =
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3853
				css + skb->csum_offset;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3854
	context_desc->upper_setup.tcp_fields.tucse = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3855
	context_desc->tcp_seg_setup.data = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3856
	context_desc->cmd_and_length = cpu_to_le32(cmd_len);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3857
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3858
	buffer_info->time_stamp = jiffies;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3859
	buffer_info->next_to_watch = i;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3860
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3861
	i++;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3862
	if (i == tx_ring->count)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3863
		i = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3864
	tx_ring->next_to_use = i;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3865
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3866
	return 1;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3867
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3868
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3869
#define E1000_MAX_PER_TXD	8192
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3870
#define E1000_MAX_TXD_PWR	12
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3871
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3872
static int e1000_tx_map(struct e1000_adapter *adapter,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3873
			struct sk_buff *skb, unsigned int first,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3874
			unsigned int max_per_txd, unsigned int nr_frags,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3875
			unsigned int mss)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3876
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3877
	struct e1000_ring *tx_ring = adapter->tx_ring;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3878
	struct pci_dev *pdev = adapter->pdev;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3879
	struct e1000_buffer *buffer_info;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3880
	unsigned int len = skb_headlen(skb);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3881
	unsigned int offset = 0, size, count = 0, i;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3882
	unsigned int f;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3883
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3884
	i = tx_ring->next_to_use;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3885
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3886
	while (len) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3887
		buffer_info = &tx_ring->buffer_info[i];
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3888
		size = min(len, max_per_txd);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3889
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3890
		buffer_info->length = size;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3891
		buffer_info->time_stamp = jiffies;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3892
		buffer_info->next_to_watch = i;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3893
		buffer_info->dma = pci_map_single(pdev,	skb->data + offset,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3894
						  size,	PCI_DMA_TODEVICE);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3895
		buffer_info->mapped_as_page = false;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3896
		if (pci_dma_mapping_error(pdev, buffer_info->dma))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3897
			goto dma_error;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3898
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3899
		len -= size;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3900
		offset += size;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3901
		count++;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3902
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3903
		if (len) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3904
			i++;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3905
			if (i == tx_ring->count)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3906
				i = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3907
		}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3908
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3909
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3910
	for (f = 0; f < nr_frags; f++) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3911
		struct skb_frag_struct *frag;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3912
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3913
		frag = &skb_shinfo(skb)->frags[f];
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3914
		len = frag->size;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3915
		offset = frag->page_offset;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3916
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3917
		while (len) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3918
			i++;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3919
			if (i == tx_ring->count)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3920
				i = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3921
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3922
			buffer_info = &tx_ring->buffer_info[i];
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3923
			size = min(len, max_per_txd);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3924
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3925
			buffer_info->length = size;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3926
			buffer_info->time_stamp = jiffies;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3927
			buffer_info->next_to_watch = i;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3928
			buffer_info->dma = pci_map_page(pdev, frag->page,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3929
							offset, size,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3930
							PCI_DMA_TODEVICE);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3931
			buffer_info->mapped_as_page = true;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3932
			if (pci_dma_mapping_error(pdev, buffer_info->dma))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3933
				goto dma_error;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3934
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3935
			len -= size;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3936
			offset += size;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3937
			count++;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3938
		}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3939
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3940
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3941
	tx_ring->buffer_info[i].skb = skb;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3942
	tx_ring->buffer_info[first].next_to_watch = i;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3943
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3944
	return count;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3945
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3946
dma_error:
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3947
	dev_err(&pdev->dev, "TX DMA map failed\n");
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3948
	buffer_info->dma = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3949
	if (count)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3950
		count--;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3951
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3952
	while (count--) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3953
		if (i==0)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3954
			i += tx_ring->count;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3955
		i--;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3956
		buffer_info = &tx_ring->buffer_info[i];
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3957
		e1000_put_txbuf(adapter, buffer_info);;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3958
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3959
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3960
	return 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3961
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3962
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3963
static void e1000_tx_queue(struct e1000_adapter *adapter,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3964
			   int tx_flags, int count)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3965
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3966
	struct e1000_ring *tx_ring = adapter->tx_ring;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3967
	struct e1000_tx_desc *tx_desc = NULL;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3968
	struct e1000_buffer *buffer_info;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3969
	u32 txd_upper = 0, txd_lower = E1000_TXD_CMD_IFCS;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3970
	unsigned int i;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3971
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3972
	if (tx_flags & E1000_TX_FLAGS_TSO) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3973
		txd_lower |= E1000_TXD_CMD_DEXT | E1000_TXD_DTYP_D |
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3974
			     E1000_TXD_CMD_TSE;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3975
		txd_upper |= E1000_TXD_POPTS_TXSM << 8;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3976
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3977
		if (tx_flags & E1000_TX_FLAGS_IPV4)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3978
			txd_upper |= E1000_TXD_POPTS_IXSM << 8;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3979
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3980
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3981
	if (tx_flags & E1000_TX_FLAGS_CSUM) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3982
		txd_lower |= E1000_TXD_CMD_DEXT | E1000_TXD_DTYP_D;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3983
		txd_upper |= E1000_TXD_POPTS_TXSM << 8;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3984
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3985
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3986
	if (tx_flags & E1000_TX_FLAGS_VLAN) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3987
		txd_lower |= E1000_TXD_CMD_VLE;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3988
		txd_upper |= (tx_flags & E1000_TX_FLAGS_VLAN_MASK);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3989
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3990
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3991
	i = tx_ring->next_to_use;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3992
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3993
	while (count--) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3994
		buffer_info = &tx_ring->buffer_info[i];
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3995
		tx_desc = E1000_TX_DESC(*tx_ring, i);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3996
		tx_desc->buffer_addr = cpu_to_le64(buffer_info->dma);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3997
		tx_desc->lower.data =
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3998
			cpu_to_le32(txd_lower | buffer_info->length);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3999
		tx_desc->upper.data = cpu_to_le32(txd_upper);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4000
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4001
		i++;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4002
		if (i == tx_ring->count)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4003
			i = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4004
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4005
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4006
	tx_desc->lower.data |= cpu_to_le32(adapter->txd_cmd);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4007
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4008
	/*
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4009
	 * Force memory writes to complete before letting h/w
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4010
	 * know there are new descriptors to fetch.  (Only
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4011
	 * applicable for weak-ordered memory model archs,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4012
	 * such as IA-64).
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4013
	 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4014
	wmb();
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4015
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4016
	tx_ring->next_to_use = i;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4017
	writel(i, adapter->hw.hw_addr + tx_ring->tail);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4018
	/*
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4019
	 * we need this if more than one processor can write to our tail
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4020
	 * at a time, it synchronizes IO on IA64/Altix systems
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4021
	 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4022
	mmiowb();
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4023
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4024
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4025
#define MINIMUM_DHCP_PACKET_SIZE 282
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4026
static int e1000_transfer_dhcp_info(struct e1000_adapter *adapter,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4027
				    struct sk_buff *skb)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4028
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4029
	struct e1000_hw *hw =  &adapter->hw;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4030
	u16 length, offset;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4031
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4032
	if (vlan_tx_tag_present(skb)) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4033
		if (!((vlan_tx_tag_get(skb) == adapter->hw.mng_cookie.vlan_id) &&
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4034
		    (adapter->hw.mng_cookie.status &
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4035
			E1000_MNG_DHCP_COOKIE_STATUS_VLAN)))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4036
			return 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4037
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4038
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4039
	if (skb->len <= MINIMUM_DHCP_PACKET_SIZE)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4040
		return 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4041
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4042
	if (((struct ethhdr *) skb->data)->h_proto != htons(ETH_P_IP))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4043
		return 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4044
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4045
	{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4046
		const struct iphdr *ip = (struct iphdr *)((u8 *)skb->data+14);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4047
		struct udphdr *udp;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4048
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4049
		if (ip->protocol != IPPROTO_UDP)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4050
			return 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4051
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4052
		udp = (struct udphdr *)((u8 *)ip + (ip->ihl << 2));
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4053
		if (ntohs(udp->dest) != 67)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4054
			return 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4055
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4056
		offset = (u8 *)udp + 8 - skb->data;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4057
		length = skb->len - offset;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4058
		return e1000e_mng_write_dhcp_info(hw, (u8 *)udp + 8, length);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4059
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4060
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4061
	return 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4062
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4063
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4064
static int __e1000_maybe_stop_tx(struct net_device *netdev, int size)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4065
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4066
	struct e1000_adapter *adapter = netdev_priv(netdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4067
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4068
	netif_stop_queue(netdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4069
	/*
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4070
	 * Herbert's original patch had:
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4071
	 *  smp_mb__after_netif_stop_queue();
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4072
	 * but since that doesn't exist yet, just open code it.
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4073
	 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4074
	smp_mb();
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4075
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4076
	/*
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4077
	 * We need to check again in a case another CPU has just
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4078
	 * made room available.
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4079
	 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4080
	if (e1000_desc_unused(adapter->tx_ring) < size)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4081
		return -EBUSY;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4082
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4083
	/* A reprieve! */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4084
	netif_start_queue(netdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4085
	++adapter->restart_queue;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4086
	return 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4087
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4088
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4089
static int e1000_maybe_stop_tx(struct net_device *netdev, int size)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4090
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4091
	struct e1000_adapter *adapter = netdev_priv(netdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4092
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4093
	if (e1000_desc_unused(adapter->tx_ring) >= size)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4094
		return 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4095
	return __e1000_maybe_stop_tx(netdev, size);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4096
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4097
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4098
#define TXD_USE_COUNT(S, X) (((S) >> (X)) + 1 )
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4099
static netdev_tx_t e1000_xmit_frame(struct sk_buff *skb,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4100
				    struct net_device *netdev)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4101
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4102
	struct e1000_adapter *adapter = netdev_priv(netdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4103
	struct e1000_ring *tx_ring = adapter->tx_ring;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4104
	unsigned int first;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4105
	unsigned int max_per_txd = E1000_MAX_PER_TXD;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4106
	unsigned int max_txd_pwr = E1000_MAX_TXD_PWR;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4107
	unsigned int tx_flags = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4108
	unsigned int len = skb->len - skb->data_len;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4109
	unsigned int nr_frags;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4110
	unsigned int mss;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4111
	int count = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4112
	int tso;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4113
	unsigned int f;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4114
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4115
	if (test_bit(__E1000_DOWN, &adapter->state)) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4116
		dev_kfree_skb_any(skb);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4117
		return NETDEV_TX_OK;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4118
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4119
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4120
	if (skb->len <= 0) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4121
		dev_kfree_skb_any(skb);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4122
		return NETDEV_TX_OK;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4123
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4124
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4125
	mss = skb_shinfo(skb)->gso_size;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4126
	/*
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4127
	 * The controller does a simple calculation to
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4128
	 * make sure there is enough room in the FIFO before
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4129
	 * initiating the DMA for each buffer.  The calc is:
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4130
	 * 4 = ceil(buffer len/mss).  To make sure we don't
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4131
	 * overrun the FIFO, adjust the max buffer len if mss
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4132
	 * drops.
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4133
	 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4134
	if (mss) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4135
		u8 hdr_len;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4136
		max_per_txd = min(mss << 2, max_per_txd);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4137
		max_txd_pwr = fls(max_per_txd) - 1;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4138
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4139
		/*
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4140
		 * TSO Workaround for 82571/2/3 Controllers -- if skb->data
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4141
		 * points to just header, pull a few bytes of payload from
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4142
		 * frags into skb->data
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4143
		 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4144
		hdr_len = skb_transport_offset(skb) + tcp_hdrlen(skb);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4145
		/*
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4146
		 * we do this workaround for ES2LAN, but it is un-necessary,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4147
		 * avoiding it could save a lot of cycles
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4148
		 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4149
		if (skb->data_len && (hdr_len == len)) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4150
			unsigned int pull_size;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4151
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4152
			pull_size = min((unsigned int)4, skb->data_len);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4153
			if (!__pskb_pull_tail(skb, pull_size)) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4154
				e_err("__pskb_pull_tail failed.\n");
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4155
				dev_kfree_skb_any(skb);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4156
				return NETDEV_TX_OK;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4157
			}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4158
			len = skb->len - skb->data_len;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4159
		}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4160
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4161
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4162
	/* reserve a descriptor for the offload context */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4163
	if ((mss) || (skb->ip_summed == CHECKSUM_PARTIAL))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4164
		count++;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4165
	count++;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4166
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4167
	count += TXD_USE_COUNT(len, max_txd_pwr);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4168
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4169
	nr_frags = skb_shinfo(skb)->nr_frags;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4170
	for (f = 0; f < nr_frags; f++)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4171
		count += TXD_USE_COUNT(skb_shinfo(skb)->frags[f].size,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4172
				       max_txd_pwr);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4173
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4174
	if (adapter->hw.mac.tx_pkt_filtering)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4175
		e1000_transfer_dhcp_info(adapter, skb);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4176
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4177
	/*
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4178
	 * need: count + 2 desc gap to keep tail from touching
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4179
	 * head, otherwise try next time
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4180
	 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4181
	if (e1000_maybe_stop_tx(netdev, count + 2))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4182
		return NETDEV_TX_BUSY;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4183
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4184
	if (adapter->vlgrp && vlan_tx_tag_present(skb)) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4185
		tx_flags |= E1000_TX_FLAGS_VLAN;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4186
		tx_flags |= (vlan_tx_tag_get(skb) << E1000_TX_FLAGS_VLAN_SHIFT);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4187
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4188
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4189
	first = tx_ring->next_to_use;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4190
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4191
	tso = e1000_tso(adapter, skb);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4192
	if (tso < 0) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4193
		dev_kfree_skb_any(skb);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4194
		return NETDEV_TX_OK;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4195
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4196
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4197
	if (tso)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4198
		tx_flags |= E1000_TX_FLAGS_TSO;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4199
	else if (e1000_tx_csum(adapter, skb))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4200
		tx_flags |= E1000_TX_FLAGS_CSUM;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4201
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4202
	/*
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4203
	 * Old method was to assume IPv4 packet by default if TSO was enabled.
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4204
	 * 82571 hardware supports TSO capabilities for IPv6 as well...
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4205
	 * no longer assume, we must.
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4206
	 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4207
	if (skb->protocol == htons(ETH_P_IP))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4208
		tx_flags |= E1000_TX_FLAGS_IPV4;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4209
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4210
	/* if count is 0 then mapping error has occured */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4211
	count = e1000_tx_map(adapter, skb, first, max_per_txd, nr_frags, mss);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4212
	if (count) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4213
		e1000_tx_queue(adapter, tx_flags, count);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4214
		/* Make sure there is space in the ring for the next send. */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4215
		e1000_maybe_stop_tx(netdev, MAX_SKB_FRAGS + 2);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4216
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4217
	} else {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4218
		dev_kfree_skb_any(skb);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4219
		tx_ring->buffer_info[first].time_stamp = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4220
		tx_ring->next_to_use = first;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4221
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4222
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4223
	return NETDEV_TX_OK;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4224
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4225
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4226
/**
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4227
 * e1000_tx_timeout - Respond to a Tx Hang
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4228
 * @netdev: network interface device structure
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4229
 **/
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4230
static void e1000_tx_timeout(struct net_device *netdev)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4231
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4232
	struct e1000_adapter *adapter = netdev_priv(netdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4233
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4234
	/* Do the reset outside of interrupt context */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4235
	adapter->tx_timeout_count++;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4236
	schedule_work(&adapter->reset_task);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4237
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4238
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4239
static void e1000_reset_task(struct work_struct *work)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4240
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4241
	struct e1000_adapter *adapter;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4242
	adapter = container_of(work, struct e1000_adapter, reset_task);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4243
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4244
	e1000e_reinit_locked(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4245
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4246
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4247
/**
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4248
 * e1000_get_stats - Get System Network Statistics
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4249
 * @netdev: network interface device structure
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4250
 *
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4251
 * Returns the address of the device statistics structure.
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4252
 * The statistics are actually updated from the timer callback.
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4253
 **/
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4254
static struct net_device_stats *e1000_get_stats(struct net_device *netdev)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4255
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4256
	/* only return the current stats */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4257
	return &netdev->stats;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4258
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4259
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4260
/**
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4261
 * e1000_change_mtu - Change the Maximum Transfer Unit
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4262
 * @netdev: network interface device structure
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4263
 * @new_mtu: new value for maximum frame size
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4264
 *
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4265
 * Returns 0 on success, negative on failure
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4266
 **/
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4267
static int e1000_change_mtu(struct net_device *netdev, int new_mtu)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4268
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4269
	struct e1000_adapter *adapter = netdev_priv(netdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4270
	int max_frame = new_mtu + ETH_HLEN + ETH_FCS_LEN;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4271
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4272
	/* Jumbo frame support */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4273
	if ((max_frame > ETH_FRAME_LEN + ETH_FCS_LEN) &&
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4274
	    !(adapter->flags & FLAG_HAS_JUMBO_FRAMES)) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4275
		e_err("Jumbo Frames not supported.\n");
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4276
		return -EINVAL;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4277
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4278
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4279
	/* Supported frame sizes */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4280
	if ((new_mtu < ETH_ZLEN + ETH_FCS_LEN + VLAN_HLEN) ||
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4281
	    (max_frame > adapter->max_hw_frame_size)) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4282
		e_err("Unsupported MTU setting\n");
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4283
		return -EINVAL;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4284
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4285
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4286
	/* 82573 Errata 17 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4287
	if (((adapter->hw.mac.type == e1000_82573) ||
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4288
	     (adapter->hw.mac.type == e1000_82574)) &&
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4289
	    (max_frame > ETH_FRAME_LEN + ETH_FCS_LEN)) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4290
		adapter->flags2 |= FLAG2_DISABLE_ASPM_L1;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4291
		e1000e_disable_aspm(adapter->pdev, PCIE_LINK_STATE_L1);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4292
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4293
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4294
	while (test_and_set_bit(__E1000_RESETTING, &adapter->state))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4295
		msleep(1);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4296
	/* e1000e_down -> e1000e_reset dependent on max_frame_size & mtu */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4297
	adapter->max_frame_size = max_frame;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4298
	e_info("changing MTU from %d to %d\n", netdev->mtu, new_mtu);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4299
	netdev->mtu = new_mtu;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4300
	if (netif_running(netdev))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4301
		e1000e_down(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4302
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4303
	/*
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4304
	 * NOTE: netdev_alloc_skb reserves 16 bytes, and typically NET_IP_ALIGN
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4305
	 * means we reserve 2 more, this pushes us to allocate from the next
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4306
	 * larger slab size.
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4307
	 * i.e. RXBUFFER_2048 --> size-4096 slab
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4308
	 * However with the new *_jumbo_rx* routines, jumbo receives will use
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4309
	 * fragmented skbs
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4310
	 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4311
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4312
	if (max_frame <= 2048)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4313
		adapter->rx_buffer_len = 2048;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4314
	else
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4315
		adapter->rx_buffer_len = 4096;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4316
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4317
	/* adjust allocation if LPE protects us, and we aren't using SBP */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4318
	if ((max_frame == ETH_FRAME_LEN + ETH_FCS_LEN) ||
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4319
	     (max_frame == ETH_FRAME_LEN + VLAN_HLEN + ETH_FCS_LEN))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4320
		adapter->rx_buffer_len = ETH_FRAME_LEN + VLAN_HLEN
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4321
					 + ETH_FCS_LEN;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4322
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4323
	if (netif_running(netdev))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4324
		e1000e_up(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4325
	else
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4326
		e1000e_reset(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4327
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4328
	clear_bit(__E1000_RESETTING, &adapter->state);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4329
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4330
	return 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4331
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4332
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4333
static int e1000_mii_ioctl(struct net_device *netdev, struct ifreq *ifr,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4334
			   int cmd)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4335
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4336
	struct e1000_adapter *adapter = netdev_priv(netdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4337
	struct mii_ioctl_data *data = if_mii(ifr);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4338
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4339
	if (adapter->hw.phy.media_type != e1000_media_type_copper)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4340
		return -EOPNOTSUPP;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4341
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4342
	switch (cmd) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4343
	case SIOCGMIIPHY:
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4344
		data->phy_id = adapter->hw.phy.addr;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4345
		break;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4346
	case SIOCGMIIREG:
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4347
		e1000_phy_read_status(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4348
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4349
		switch (data->reg_num & 0x1F) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4350
		case MII_BMCR:
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4351
			data->val_out = adapter->phy_regs.bmcr;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4352
			break;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4353
		case MII_BMSR:
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4354
			data->val_out = adapter->phy_regs.bmsr;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4355
			break;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4356
		case MII_PHYSID1:
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4357
			data->val_out = (adapter->hw.phy.id >> 16);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4358
			break;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4359
		case MII_PHYSID2:
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4360
			data->val_out = (adapter->hw.phy.id & 0xFFFF);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4361
			break;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4362
		case MII_ADVERTISE:
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4363
			data->val_out = adapter->phy_regs.advertise;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4364
			break;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4365
		case MII_LPA:
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4366
			data->val_out = adapter->phy_regs.lpa;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4367
			break;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4368
		case MII_EXPANSION:
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4369
			data->val_out = adapter->phy_regs.expansion;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4370
			break;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4371
		case MII_CTRL1000:
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4372
			data->val_out = adapter->phy_regs.ctrl1000;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4373
			break;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4374
		case MII_STAT1000:
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4375
			data->val_out = adapter->phy_regs.stat1000;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4376
			break;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4377
		case MII_ESTATUS:
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4378
			data->val_out = adapter->phy_regs.estatus;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4379
			break;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4380
		default:
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4381
			return -EIO;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4382
		}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4383
		break;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4384
	case SIOCSMIIREG:
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4385
	default:
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4386
		return -EOPNOTSUPP;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4387
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4388
	return 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4389
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4390
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4391
static int e1000_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4392
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4393
	switch (cmd) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4394
	case SIOCGMIIPHY:
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4395
	case SIOCGMIIREG:
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4396
	case SIOCSMIIREG:
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4397
		return e1000_mii_ioctl(netdev, ifr, cmd);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4398
	default:
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4399
		return -EOPNOTSUPP;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4400
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4401
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4402
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4403
static int e1000_init_phy_wakeup(struct e1000_adapter *adapter, u32 wufc)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4404
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4405
	struct e1000_hw *hw = &adapter->hw;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4406
	u32 i, mac_reg;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4407
	u16 phy_reg;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4408
	int retval = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4409
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4410
	/* copy MAC RARs to PHY RARs */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4411
	for (i = 0; i < adapter->hw.mac.rar_entry_count; i++) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4412
		mac_reg = er32(RAL(i));
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4413
		e1e_wphy(hw, BM_RAR_L(i), (u16)(mac_reg & 0xFFFF));
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4414
		e1e_wphy(hw, BM_RAR_M(i), (u16)((mac_reg >> 16) & 0xFFFF));
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4415
		mac_reg = er32(RAH(i));
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4416
		e1e_wphy(hw, BM_RAR_H(i), (u16)(mac_reg & 0xFFFF));
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4417
		e1e_wphy(hw, BM_RAR_CTRL(i), (u16)((mac_reg >> 16) & 0xFFFF));
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4418
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4419
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4420
	/* copy MAC MTA to PHY MTA */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4421
	for (i = 0; i < adapter->hw.mac.mta_reg_count; i++) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4422
		mac_reg = E1000_READ_REG_ARRAY(hw, E1000_MTA, i);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4423
		e1e_wphy(hw, BM_MTA(i), (u16)(mac_reg & 0xFFFF));
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4424
		e1e_wphy(hw, BM_MTA(i) + 1, (u16)((mac_reg >> 16) & 0xFFFF));
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4425
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4426
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4427
	/* configure PHY Rx Control register */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4428
	e1e_rphy(&adapter->hw, BM_RCTL, &phy_reg);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4429
	mac_reg = er32(RCTL);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4430
	if (mac_reg & E1000_RCTL_UPE)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4431
		phy_reg |= BM_RCTL_UPE;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4432
	if (mac_reg & E1000_RCTL_MPE)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4433
		phy_reg |= BM_RCTL_MPE;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4434
	phy_reg &= ~(BM_RCTL_MO_MASK);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4435
	if (mac_reg & E1000_RCTL_MO_3)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4436
		phy_reg |= (((mac_reg & E1000_RCTL_MO_3) >> E1000_RCTL_MO_SHIFT)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4437
				<< BM_RCTL_MO_SHIFT);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4438
	if (mac_reg & E1000_RCTL_BAM)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4439
		phy_reg |= BM_RCTL_BAM;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4440
	if (mac_reg & E1000_RCTL_PMCF)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4441
		phy_reg |= BM_RCTL_PMCF;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4442
	mac_reg = er32(CTRL);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4443
	if (mac_reg & E1000_CTRL_RFCE)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4444
		phy_reg |= BM_RCTL_RFCE;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4445
	e1e_wphy(&adapter->hw, BM_RCTL, phy_reg);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4446
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4447
	/* enable PHY wakeup in MAC register */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4448
	ew32(WUFC, wufc);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4449
	ew32(WUC, E1000_WUC_PHY_WAKE | E1000_WUC_PME_EN);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4450
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4451
	/* configure and enable PHY wakeup in PHY registers */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4452
	e1e_wphy(&adapter->hw, BM_WUFC, wufc);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4453
	e1e_wphy(&adapter->hw, BM_WUC, E1000_WUC_PME_EN);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4454
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4455
	/* activate PHY wakeup */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4456
	retval = hw->phy.ops.acquire(hw);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4457
	if (retval) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4458
		e_err("Could not acquire PHY\n");
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4459
		return retval;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4460
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4461
	e1000e_write_phy_reg_mdic(hw, IGP01E1000_PHY_PAGE_SELECT,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4462
	                         (BM_WUC_ENABLE_PAGE << IGP_PAGE_SHIFT));
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4463
	retval = e1000e_read_phy_reg_mdic(hw, BM_WUC_ENABLE_REG, &phy_reg);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4464
	if (retval) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4465
		e_err("Could not read PHY page 769\n");
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4466
		goto out;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4467
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4468
	phy_reg |= BM_WUC_ENABLE_BIT | BM_WUC_HOST_WU_BIT;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4469
	retval = e1000e_write_phy_reg_mdic(hw, BM_WUC_ENABLE_REG, phy_reg);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4470
	if (retval)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4471
		e_err("Could not set PHY Host Wakeup bit\n");
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4472
out:
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4473
	hw->phy.ops.release(hw);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4474
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4475
	return retval;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4476
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4477
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4478
static int __e1000_shutdown(struct pci_dev *pdev, bool *enable_wake)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4479
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4480
	struct net_device *netdev = pci_get_drvdata(pdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4481
	struct e1000_adapter *adapter = netdev_priv(netdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4482
	struct e1000_hw *hw = &adapter->hw;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4483
	u32 ctrl, ctrl_ext, rctl, status;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4484
	u32 wufc = adapter->wol;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4485
	int retval = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4486
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4487
	netif_device_detach(netdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4488
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4489
	if (netif_running(netdev)) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4490
		WARN_ON(test_bit(__E1000_RESETTING, &adapter->state));
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4491
		e1000e_down(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4492
		e1000_free_irq(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4493
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4494
	e1000e_reset_interrupt_capability(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4495
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4496
	retval = pci_save_state(pdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4497
	if (retval)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4498
		return retval;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4499
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4500
	status = er32(STATUS);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4501
	if (status & E1000_STATUS_LU)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4502
		wufc &= ~E1000_WUFC_LNKC;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4503
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4504
	if (wufc) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4505
		e1000_setup_rctl(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4506
		e1000_set_multi(netdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4507
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4508
		/* turn on all-multi mode if wake on multicast is enabled */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4509
		if (wufc & E1000_WUFC_MC) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4510
			rctl = er32(RCTL);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4511
			rctl |= E1000_RCTL_MPE;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4512
			ew32(RCTL, rctl);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4513
		}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4514
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4515
		ctrl = er32(CTRL);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4516
		/* advertise wake from D3Cold */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4517
		#define E1000_CTRL_ADVD3WUC 0x00100000
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4518
		/* phy power management enable */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4519
		#define E1000_CTRL_EN_PHY_PWR_MGMT 0x00200000
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4520
		ctrl |= E1000_CTRL_ADVD3WUC;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4521
		if (!(adapter->flags2 & FLAG2_HAS_PHY_WAKEUP))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4522
			ctrl |= E1000_CTRL_EN_PHY_PWR_MGMT;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4523
		ew32(CTRL, ctrl);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4524
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4525
		if (adapter->hw.phy.media_type == e1000_media_type_fiber ||
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4526
		    adapter->hw.phy.media_type ==
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4527
		    e1000_media_type_internal_serdes) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4528
			/* keep the laser running in D3 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4529
			ctrl_ext = er32(CTRL_EXT);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4530
			ctrl_ext |= E1000_CTRL_EXT_SDP3_DATA;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4531
			ew32(CTRL_EXT, ctrl_ext);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4532
		}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4533
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4534
		if (adapter->flags & FLAG_IS_ICH)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4535
			e1000e_disable_gig_wol_ich8lan(&adapter->hw);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4536
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4537
		/* Allow time for pending master requests to run */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4538
		e1000e_disable_pcie_master(&adapter->hw);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4539
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4540
		if (adapter->flags2 & FLAG2_HAS_PHY_WAKEUP) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4541
			/* enable wakeup by the PHY */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4542
			retval = e1000_init_phy_wakeup(adapter, wufc);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4543
			if (retval)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4544
				return retval;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4545
		} else {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4546
			/* enable wakeup by the MAC */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4547
			ew32(WUFC, wufc);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4548
			ew32(WUC, E1000_WUC_PME_EN);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4549
		}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4550
	} else {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4551
		ew32(WUC, 0);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4552
		ew32(WUFC, 0);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4553
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4554
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4555
	*enable_wake = !!wufc;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4556
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4557
	/* make sure adapter isn't asleep if manageability is enabled */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4558
	if ((adapter->flags & FLAG_MNG_PT_ENABLED) ||
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4559
	    (hw->mac.ops.check_mng_mode(hw)))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4560
		*enable_wake = true;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4561
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4562
	if (adapter->hw.phy.type == e1000_phy_igp_3)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4563
		e1000e_igp3_phy_powerdown_workaround_ich8lan(&adapter->hw);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4564
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4565
	/*
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4566
	 * Release control of h/w to f/w.  If f/w is AMT enabled, this
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4567
	 * would have already happened in close and is redundant.
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4568
	 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4569
	e1000_release_hw_control(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4570
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4571
	pci_disable_device(pdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4572
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4573
	return 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4574
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4575
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4576
static void e1000_power_off(struct pci_dev *pdev, bool sleep, bool wake)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4577
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4578
	if (sleep && wake) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4579
		pci_prepare_to_sleep(pdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4580
		return;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4581
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4582
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4583
	pci_wake_from_d3(pdev, wake);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4584
	pci_set_power_state(pdev, PCI_D3hot);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4585
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4586
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4587
static void e1000_complete_shutdown(struct pci_dev *pdev, bool sleep,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4588
                                    bool wake)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4589
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4590
	struct net_device *netdev = pci_get_drvdata(pdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4591
	struct e1000_adapter *adapter = netdev_priv(netdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4592
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4593
	/*
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4594
	 * The pci-e switch on some quad port adapters will report a
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4595
	 * correctable error when the MAC transitions from D0 to D3.  To
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4596
	 * prevent this we need to mask off the correctable errors on the
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4597
	 * downstream port of the pci-e switch.
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4598
	 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4599
	if (adapter->flags & FLAG_IS_QUAD_PORT) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4600
		struct pci_dev *us_dev = pdev->bus->self;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4601
		int pos = pci_find_capability(us_dev, PCI_CAP_ID_EXP);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4602
		u16 devctl;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4603
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4604
		pci_read_config_word(us_dev, pos + PCI_EXP_DEVCTL, &devctl);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4605
		pci_write_config_word(us_dev, pos + PCI_EXP_DEVCTL,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4606
		                      (devctl & ~PCI_EXP_DEVCTL_CERE));
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4607
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4608
		e1000_power_off(pdev, sleep, wake);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4609
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4610
		pci_write_config_word(us_dev, pos + PCI_EXP_DEVCTL, devctl);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4611
	} else {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4612
		e1000_power_off(pdev, sleep, wake);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4613
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4614
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4615
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4616
#ifdef CONFIG_PCIEASPM
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4617
static void __e1000e_disable_aspm(struct pci_dev *pdev, u16 state)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4618
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4619
	pci_disable_link_state(pdev, state);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4620
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4621
#else
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4622
static void __e1000e_disable_aspm(struct pci_dev *pdev, u16 state)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4623
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4624
	int pos;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4625
	u16 reg16;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4626
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4627
	/*
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4628
	 * Both device and parent should have the same ASPM setting.
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4629
	 * Disable ASPM in downstream component first and then upstream.
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4630
	 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4631
	pos = pci_pcie_cap(pdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4632
	pci_read_config_word(pdev, pos + PCI_EXP_LNKCTL, &reg16);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4633
	reg16 &= ~state;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4634
	pci_write_config_word(pdev, pos + PCI_EXP_LNKCTL, reg16);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4635
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4636
	if (!pdev->bus->self)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4637
		return;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4638
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4639
	pos = pci_pcie_cap(pdev->bus->self);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4640
	pci_read_config_word(pdev->bus->self, pos + PCI_EXP_LNKCTL, &reg16);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4641
	reg16 &= ~state;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4642
	pci_write_config_word(pdev->bus->self, pos + PCI_EXP_LNKCTL, reg16);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4643
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4644
#endif
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4645
void e1000e_disable_aspm(struct pci_dev *pdev, u16 state)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4646
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4647
	dev_info(&pdev->dev, "Disabling ASPM %s %s\n",
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4648
		 (state & PCIE_LINK_STATE_L0S) ? "L0s" : "",
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4649
		 (state & PCIE_LINK_STATE_L1) ? "L1" : "");
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4650
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4651
	__e1000e_disable_aspm(pdev, state);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4652
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4653
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4654
#ifdef CONFIG_PM
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4655
static int e1000_suspend(struct pci_dev *pdev, pm_message_t state)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4656
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4657
	int retval;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4658
	bool wake;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4659
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4660
	retval = __e1000_shutdown(pdev, &wake);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4661
	if (!retval)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4662
		e1000_complete_shutdown(pdev, true, wake);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4663
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4664
	return retval;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4665
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4666
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4667
static int e1000_resume(struct pci_dev *pdev)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4668
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4669
	struct net_device *netdev = pci_get_drvdata(pdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4670
	struct e1000_adapter *adapter = netdev_priv(netdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4671
	struct e1000_hw *hw = &adapter->hw;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4672
	u32 err;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4673
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4674
	pci_set_power_state(pdev, PCI_D0);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4675
	pci_restore_state(pdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4676
	pci_save_state(pdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4677
	if (adapter->flags2 & FLAG2_DISABLE_ASPM_L1)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4678
		e1000e_disable_aspm(pdev, PCIE_LINK_STATE_L1);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4679
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4680
	err = pci_enable_device_mem(pdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4681
	if (err) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4682
		dev_err(&pdev->dev,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4683
			"Cannot enable PCI device from suspend\n");
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4684
		return err;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4685
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4686
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4687
	pci_set_master(pdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4688
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4689
	pci_enable_wake(pdev, PCI_D3hot, 0);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4690
	pci_enable_wake(pdev, PCI_D3cold, 0);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4691
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4692
	e1000e_set_interrupt_capability(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4693
	if (netif_running(netdev)) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4694
		err = e1000_request_irq(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4695
		if (err)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4696
			return err;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4697
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4698
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4699
	e1000e_power_up_phy(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4700
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4701
	/* report the system wakeup cause from S3/S4 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4702
	if (adapter->flags2 & FLAG2_HAS_PHY_WAKEUP) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4703
		u16 phy_data;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4704
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4705
		e1e_rphy(&adapter->hw, BM_WUS, &phy_data);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4706
		if (phy_data) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4707
			e_info("PHY Wakeup cause - %s\n",
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4708
				phy_data & E1000_WUS_EX ? "Unicast Packet" :
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4709
				phy_data & E1000_WUS_MC ? "Multicast Packet" :
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4710
				phy_data & E1000_WUS_BC ? "Broadcast Packet" :
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4711
				phy_data & E1000_WUS_MAG ? "Magic Packet" :
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4712
				phy_data & E1000_WUS_LNKC ? "Link Status "
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4713
				" Change" : "other");
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4714
		}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4715
		e1e_wphy(&adapter->hw, BM_WUS, ~0);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4716
	} else {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4717
		u32 wus = er32(WUS);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4718
		if (wus) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4719
			e_info("MAC Wakeup cause - %s\n",
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4720
				wus & E1000_WUS_EX ? "Unicast Packet" :
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4721
				wus & E1000_WUS_MC ? "Multicast Packet" :
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4722
				wus & E1000_WUS_BC ? "Broadcast Packet" :
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4723
				wus & E1000_WUS_MAG ? "Magic Packet" :
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4724
				wus & E1000_WUS_LNKC ? "Link Status Change" :
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4725
				"other");
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4726
		}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4727
		ew32(WUS, ~0);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4728
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4729
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4730
	e1000e_reset(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4731
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4732
	e1000_init_manageability(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4733
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4734
	if (netif_running(netdev))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4735
		e1000e_up(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4736
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4737
	netif_device_attach(netdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4738
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4739
	/*
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4740
	 * If the controller has AMT, do not set DRV_LOAD until the interface
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
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
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4742
	 * under the control of the driver.
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4743
	 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4744
	if (!(adapter->flags & FLAG_HAS_AMT))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4745
		e1000_get_hw_control(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4746
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4747
	return 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4748
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4749
#endif
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4750
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4751
static void e1000_shutdown(struct pci_dev *pdev)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4752
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4753
	bool wake = false;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4754
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4755
	__e1000_shutdown(pdev, &wake);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4756
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4757
	if (system_state == SYSTEM_POWER_OFF)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4758
		e1000_complete_shutdown(pdev, false, wake);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4759
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4760
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4761
#ifdef CONFIG_NET_POLL_CONTROLLER
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4762
/*
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4763
 * Polling 'interrupt' - used by things like netconsole to send skbs
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4764
 * without having to re-enable interrupts. It's not called while
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4765
 * the interrupt routine is executing.
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4766
 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4767
static void e1000_netpoll(struct net_device *netdev)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4768
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4769
	struct e1000_adapter *adapter = netdev_priv(netdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4770
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4771
	disable_irq(adapter->pdev->irq);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4772
	e1000_intr(adapter->pdev->irq, netdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4773
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4774
	enable_irq(adapter->pdev->irq);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4775
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4776
#endif
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4777
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4778
/**
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4779
 * e1000_io_error_detected - called when PCI error is detected
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4780
 * @pdev: Pointer to PCI device
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4781
 * @state: The current pci connection state
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4782
 *
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4783
 * This function is called after a PCI bus error affecting
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4784
 * this device has been detected.
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4785
 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4786
static pci_ers_result_t e1000_io_error_detected(struct pci_dev *pdev,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4787
						pci_channel_state_t state)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4788
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4789
	struct net_device *netdev = pci_get_drvdata(pdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4790
	struct e1000_adapter *adapter = netdev_priv(netdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4791
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4792
	netif_device_detach(netdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4793
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4794
	if (state == pci_channel_io_perm_failure)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4795
		return PCI_ERS_RESULT_DISCONNECT;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4796
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4797
	if (netif_running(netdev))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4798
		e1000e_down(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4799
	pci_disable_device(pdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4800
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4801
	/* Request a slot slot reset. */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4802
	return PCI_ERS_RESULT_NEED_RESET;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4803
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4804
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4805
/**
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4806
 * e1000_io_slot_reset - called after the pci bus has been reset.
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4807
 * @pdev: Pointer to PCI device
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4808
 *
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4809
 * Restart the card from scratch, as if from a cold-boot. Implementation
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4810
 * resembles the first-half of the e1000_resume routine.
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4811
 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4812
static pci_ers_result_t e1000_io_slot_reset(struct pci_dev *pdev)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4813
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4814
	struct net_device *netdev = pci_get_drvdata(pdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4815
	struct e1000_adapter *adapter = netdev_priv(netdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4816
	struct e1000_hw *hw = &adapter->hw;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4817
	int err;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4818
	pci_ers_result_t result;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4819
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4820
	if (adapter->flags2 & FLAG2_DISABLE_ASPM_L1)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4821
		e1000e_disable_aspm(pdev, PCIE_LINK_STATE_L1);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4822
	err = pci_enable_device_mem(pdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4823
	if (err) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4824
		dev_err(&pdev->dev,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4825
			"Cannot re-enable PCI device after reset.\n");
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4826
		result = PCI_ERS_RESULT_DISCONNECT;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4827
	} else {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4828
		pci_set_master(pdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4829
		pci_restore_state(pdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4830
		pci_save_state(pdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4831
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4832
		pci_enable_wake(pdev, PCI_D3hot, 0);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4833
		pci_enable_wake(pdev, PCI_D3cold, 0);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4834
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4835
		e1000e_reset(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4836
		ew32(WUS, ~0);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4837
		result = PCI_ERS_RESULT_RECOVERED;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4838
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4839
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4840
	pci_cleanup_aer_uncorrect_error_status(pdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4841
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4842
	return result;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4843
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4844
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4845
/**
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4846
 * e1000_io_resume - called when traffic can start flowing again.
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4847
 * @pdev: Pointer to PCI device
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4848
 *
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4849
 * This callback is called when the error recovery driver tells us that
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4850
 * its OK to resume normal operation. Implementation resembles the
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4851
 * second-half of the e1000_resume routine.
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4852
 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4853
static void e1000_io_resume(struct pci_dev *pdev)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4854
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4855
	struct net_device *netdev = pci_get_drvdata(pdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4856
	struct e1000_adapter *adapter = netdev_priv(netdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4857
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4858
	e1000_init_manageability(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4859
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4860
	if (netif_running(netdev)) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4861
		if (e1000e_up(adapter)) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4862
			dev_err(&pdev->dev,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4863
				"can't bring device back up after reset\n");
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4864
			return;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4865
		}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4866
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4867
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4868
	netif_device_attach(netdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4869
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4870
	/*
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4871
	 * If the controller has AMT, do not set DRV_LOAD until the interface
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4872
	 * is up.  For all other cases, let the f/w know that the h/w is now
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4873
	 * under the control of the driver.
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4874
	 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4875
	if (!(adapter->flags & FLAG_HAS_AMT))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4876
		e1000_get_hw_control(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4877
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4878
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4879
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4880
static void e1000_print_device_info(struct e1000_adapter *adapter)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4881
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4882
	struct e1000_hw *hw = &adapter->hw;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4883
	struct net_device *netdev = adapter->netdev;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4884
	u32 pba_num;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4885
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4886
	/* print bus type/speed/width info */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4887
	e_info("(PCI Express:2.5GB/s:%s) %pM\n",
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4888
	       /* bus width */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4889
	       ((hw->bus.width == e1000_bus_width_pcie_x4) ? "Width x4" :
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4890
	        "Width x1"),
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4891
	       /* MAC address */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4892
	       netdev->dev_addr);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4893
	e_info("Intel(R) PRO/%s Network Connection\n",
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4894
	       (hw->phy.type == e1000_phy_ife) ? "10/100" : "1000");
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4895
	e1000e_read_pba_num(hw, &pba_num);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4896
	e_info("MAC: %d, PHY: %d, PBA No: %06x-%03x\n",
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4897
	       hw->mac.type, hw->phy.type, (pba_num >> 8), (pba_num & 0xff));
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4898
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4899
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4900
static void e1000_eeprom_checks(struct e1000_adapter *adapter)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4901
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4902
	struct e1000_hw *hw = &adapter->hw;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4903
	int ret_val;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4904
	u16 buf = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4905
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4906
	if (hw->mac.type != e1000_82573)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4907
		return;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4908
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4909
	ret_val = e1000_read_nvm(hw, NVM_INIT_CONTROL2_REG, 1, &buf);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4910
	if (!ret_val && (!(le16_to_cpu(buf) & (1 << 0)))) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4911
		/* Deep Smart Power Down (DSPD) */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4912
		dev_warn(&adapter->pdev->dev,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4913
			 "Warning: detected DSPD enabled in EEPROM\n");
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4914
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4915
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4916
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4917
static const struct net_device_ops e1000e_netdev_ops = {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4918
	.ndo_open		= e1000_open,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4919
	.ndo_stop		= e1000_close,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4920
	.ndo_start_xmit		= e1000_xmit_frame,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4921
	.ndo_get_stats		= e1000_get_stats,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4922
	.ndo_set_multicast_list	= e1000_set_multi,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4923
	.ndo_set_mac_address	= e1000_set_mac,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4924
	.ndo_change_mtu		= e1000_change_mtu,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4925
	.ndo_do_ioctl		= e1000_ioctl,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4926
	.ndo_tx_timeout		= e1000_tx_timeout,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4927
	.ndo_validate_addr	= eth_validate_addr,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4928
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4929
	.ndo_vlan_rx_register	= e1000_vlan_rx_register,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4930
	.ndo_vlan_rx_add_vid	= e1000_vlan_rx_add_vid,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4931
	.ndo_vlan_rx_kill_vid	= e1000_vlan_rx_kill_vid,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4932
#ifdef CONFIG_NET_POLL_CONTROLLER
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4933
	.ndo_poll_controller	= e1000_netpoll,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4934
#endif
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4935
};
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4936
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4937
/**
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4938
 * e1000_probe - Device Initialization Routine
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4939
 * @pdev: PCI device information struct
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4940
 * @ent: entry in e1000_pci_tbl
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4941
 *
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4942
 * Returns 0 on success, negative on failure
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4943
 *
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4944
 * e1000_probe initializes an adapter identified by a pci_dev structure.
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4945
 * The OS initialization, configuring of the adapter private structure,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4946
 * and a hardware reset occur.
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4947
 **/
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4948
static int __devinit e1000_probe(struct pci_dev *pdev,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4949
				 const struct pci_device_id *ent)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4950
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4951
	struct net_device *netdev;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4952
	struct e1000_adapter *adapter;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4953
	struct e1000_hw *hw;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4954
	const struct e1000_info *ei = e1000_info_tbl[ent->driver_data];
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4955
	resource_size_t mmio_start, mmio_len;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4956
	resource_size_t flash_start, flash_len;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4957
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4958
	static int cards_found;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4959
	int i, err, pci_using_dac;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4960
	u16 eeprom_data = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4961
	u16 eeprom_apme_mask = E1000_EEPROM_APME;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4962
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4963
	if (ei->flags2 & FLAG2_DISABLE_ASPM_L1)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4964
		e1000e_disable_aspm(pdev, PCIE_LINK_STATE_L1);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4965
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4966
	err = pci_enable_device_mem(pdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4967
	if (err)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4968
		return err;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4969
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4970
	pci_using_dac = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4971
	err = pci_set_dma_mask(pdev, DMA_BIT_MASK(64));
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4972
	if (!err) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4973
		err = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64));
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4974
		if (!err)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4975
			pci_using_dac = 1;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4976
	} else {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4977
		err = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4978
		if (err) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4979
			err = pci_set_consistent_dma_mask(pdev,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4980
							  DMA_BIT_MASK(32));
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4981
			if (err) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4982
				dev_err(&pdev->dev, "No usable DMA "
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4983
					"configuration, aborting\n");
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4984
				goto err_dma;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4985
			}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4986
		}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4987
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4988
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4989
	err = pci_request_selected_regions_exclusive(pdev,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4990
	                                  pci_select_bars(pdev, IORESOURCE_MEM),
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4991
	                                  e1000e_driver_name);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4992
	if (err)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4993
		goto err_pci_reg;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4994
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4995
	/* AER (Advanced Error Reporting) hooks */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4996
	pci_enable_pcie_error_reporting(pdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4997
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4998
	pci_set_master(pdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4999
	/* PCI config space info */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5000
	err = pci_save_state(pdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5001
	if (err)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5002
		goto err_alloc_etherdev;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5003
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5004
	err = -ENOMEM;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5005
	netdev = alloc_etherdev(sizeof(struct e1000_adapter));
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5006
	if (!netdev)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5007
		goto err_alloc_etherdev;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5008
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5009
	SET_NETDEV_DEV(netdev, &pdev->dev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5010
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5011
	pci_set_drvdata(pdev, netdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5012
	adapter = netdev_priv(netdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5013
	hw = &adapter->hw;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5014
	adapter->netdev = netdev;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5015
	adapter->pdev = pdev;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5016
	adapter->ei = ei;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5017
	adapter->pba = ei->pba;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5018
	adapter->flags = ei->flags;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5019
	adapter->flags2 = ei->flags2;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5020
	adapter->hw.adapter = adapter;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5021
	adapter->hw.mac.type = ei->mac;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5022
	adapter->max_hw_frame_size = ei->max_hw_frame_size;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5023
	adapter->msg_enable = (1 << NETIF_MSG_DRV | NETIF_MSG_PROBE) - 1;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5024
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5025
	mmio_start = pci_resource_start(pdev, 0);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5026
	mmio_len = pci_resource_len(pdev, 0);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5027
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5028
	err = -EIO;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5029
	adapter->hw.hw_addr = ioremap(mmio_start, mmio_len);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5030
	if (!adapter->hw.hw_addr)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5031
		goto err_ioremap;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5032
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5033
	if ((adapter->flags & FLAG_HAS_FLASH) &&
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5034
	    (pci_resource_flags(pdev, 1) & IORESOURCE_MEM)) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5035
		flash_start = pci_resource_start(pdev, 1);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5036
		flash_len = pci_resource_len(pdev, 1);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5037
		adapter->hw.flash_address = ioremap(flash_start, flash_len);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5038
		if (!adapter->hw.flash_address)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5039
			goto err_flashmap;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5040
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5041
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5042
	/* construct the net_device struct */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5043
	netdev->netdev_ops		= &e1000e_netdev_ops;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5044
	e1000e_set_ethtool_ops(netdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5045
	netdev->watchdog_timeo		= 5 * HZ;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5046
	netif_napi_add(netdev, &adapter->napi, e1000_clean, 64);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5047
	strncpy(netdev->name, pci_name(pdev), sizeof(netdev->name) - 1);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5048
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5049
	netdev->mem_start = mmio_start;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5050
	netdev->mem_end = mmio_start + mmio_len;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5051
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5052
	adapter->bd_number = cards_found++;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5053
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5054
	e1000e_check_options(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5055
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5056
	/* setup adapter struct */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5057
	err = e1000_sw_init(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5058
	if (err)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5059
		goto err_sw_init;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5060
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5061
	err = -EIO;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5062
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5063
	memcpy(&hw->mac.ops, ei->mac_ops, sizeof(hw->mac.ops));
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5064
	memcpy(&hw->nvm.ops, ei->nvm_ops, sizeof(hw->nvm.ops));
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5065
	memcpy(&hw->phy.ops, ei->phy_ops, sizeof(hw->phy.ops));
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5066
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5067
	err = ei->get_variants(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5068
	if (err)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5069
		goto err_hw_init;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5070
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5071
	if ((adapter->flags & FLAG_IS_ICH) &&
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5072
	    (adapter->flags & FLAG_READ_ONLY_NVM))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5073
		e1000e_write_protect_nvm_ich8lan(&adapter->hw);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5074
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5075
	hw->mac.ops.get_bus_info(&adapter->hw);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5076
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5077
	adapter->hw.phy.autoneg_wait_to_complete = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5078
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5079
	/* Copper options */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5080
	if (adapter->hw.phy.media_type == e1000_media_type_copper) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5081
		adapter->hw.phy.mdix = AUTO_ALL_MODES;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5082
		adapter->hw.phy.disable_polarity_correction = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5083
		adapter->hw.phy.ms_type = e1000_ms_hw_default;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5084
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5085
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5086
	if (e1000_check_reset_block(&adapter->hw))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5087
		e_info("PHY reset is blocked due to SOL/IDER session.\n");
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5088
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5089
	netdev->features = NETIF_F_SG |
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5090
			   NETIF_F_HW_CSUM |
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5091
			   NETIF_F_HW_VLAN_TX |
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5092
			   NETIF_F_HW_VLAN_RX;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5093
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5094
	if (adapter->flags & FLAG_HAS_HW_VLAN_FILTER)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5095
		netdev->features |= NETIF_F_HW_VLAN_FILTER;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5096
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5097
	netdev->features |= NETIF_F_TSO;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5098
	netdev->features |= NETIF_F_TSO6;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5099
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5100
	netdev->vlan_features |= NETIF_F_TSO;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5101
	netdev->vlan_features |= NETIF_F_TSO6;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5102
	netdev->vlan_features |= NETIF_F_HW_CSUM;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5103
	netdev->vlan_features |= NETIF_F_SG;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5104
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5105
	if (pci_using_dac)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5106
		netdev->features |= NETIF_F_HIGHDMA;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5107
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5108
	if (e1000e_enable_mng_pass_thru(&adapter->hw))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5109
		adapter->flags |= FLAG_MNG_PT_ENABLED;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5110
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5111
	/*
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5112
	 * before reading the NVM, reset the controller to
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5113
	 * put the device in a known good starting state
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5114
	 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5115
	adapter->hw.mac.ops.reset_hw(&adapter->hw);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5116
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5117
	/*
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5118
	 * systems with ASPM and others may see the checksum fail on the first
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5119
	 * attempt. Let's give it a few tries
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5120
	 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5121
	for (i = 0;; i++) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5122
		if (e1000_validate_nvm_checksum(&adapter->hw) >= 0)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5123
			break;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5124
		if (i == 2) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5125
			e_err("The NVM Checksum Is Not Valid\n");
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5126
			err = -EIO;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5127
			goto err_eeprom;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5128
		}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5129
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5130
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5131
	e1000_eeprom_checks(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5132
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5133
	/* copy the MAC address */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5134
	if (e1000e_read_mac_addr(&adapter->hw))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5135
		e_err("NVM Read Error while reading MAC address\n");
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5136
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5137
	memcpy(netdev->dev_addr, adapter->hw.mac.addr, netdev->addr_len);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5138
	memcpy(netdev->perm_addr, adapter->hw.mac.addr, netdev->addr_len);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5139
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5140
	if (!is_valid_ether_addr(netdev->perm_addr)) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5141
		e_err("Invalid MAC Address: %pM\n", netdev->perm_addr);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5142
		err = -EIO;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5143
		goto err_eeprom;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5144
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5145
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5146
	init_timer(&adapter->watchdog_timer);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5147
	adapter->watchdog_timer.function = &e1000_watchdog;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5148
	adapter->watchdog_timer.data = (unsigned long) adapter;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5149
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5150
	init_timer(&adapter->phy_info_timer);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5151
	adapter->phy_info_timer.function = &e1000_update_phy_info;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5152
	adapter->phy_info_timer.data = (unsigned long) adapter;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5153
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5154
	INIT_WORK(&adapter->reset_task, e1000_reset_task);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5155
	INIT_WORK(&adapter->watchdog_task, e1000_watchdog_task);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5156
	INIT_WORK(&adapter->downshift_task, e1000e_downshift_workaround);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5157
	INIT_WORK(&adapter->update_phy_task, e1000e_update_phy_task);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5158
	INIT_WORK(&adapter->print_hang_task, e1000_print_hw_hang);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5159
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5160
	/* Initialize link parameters. User can change them with ethtool */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5161
	adapter->hw.mac.autoneg = 1;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5162
	adapter->fc_autoneg = 1;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5163
	adapter->hw.fc.requested_mode = e1000_fc_default;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5164
	adapter->hw.fc.current_mode = e1000_fc_default;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5165
	adapter->hw.phy.autoneg_advertised = 0x2f;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5166
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5167
	/* ring size defaults */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5168
	adapter->rx_ring->count = 256;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5169
	adapter->tx_ring->count = 256;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5170
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5171
	/*
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5172
	 * Initial Wake on LAN setting - If APM wake is enabled in
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5173
	 * the EEPROM, enable the ACPI Magic Packet filter
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5174
	 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5175
	if (adapter->flags & FLAG_APME_IN_WUC) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5176
		/* APME bit in EEPROM is mapped to WUC.APME */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5177
		eeprom_data = er32(WUC);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5178
		eeprom_apme_mask = E1000_WUC_APME;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5179
		if (eeprom_data & E1000_WUC_PHY_WAKE)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5180
			adapter->flags2 |= FLAG2_HAS_PHY_WAKEUP;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5181
	} else if (adapter->flags & FLAG_APME_IN_CTRL3) {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5182
		if (adapter->flags & FLAG_APME_CHECK_PORT_B &&
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5183
		    (adapter->hw.bus.func == 1))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5184
			e1000_read_nvm(&adapter->hw,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5185
				NVM_INIT_CONTROL3_PORT_B, 1, &eeprom_data);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5186
		else
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5187
			e1000_read_nvm(&adapter->hw,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5188
				NVM_INIT_CONTROL3_PORT_A, 1, &eeprom_data);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5189
	}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5190
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5191
	/* fetch WoL from EEPROM */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5192
	if (eeprom_data & eeprom_apme_mask)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5193
		adapter->eeprom_wol |= E1000_WUFC_MAG;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5194
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5195
	/*
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5196
	 * now that we have the eeprom settings, apply the special cases
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5197
	 * where the eeprom may be wrong or the board simply won't support
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5198
	 * wake on lan on a particular port
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5199
	 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5200
	if (!(adapter->flags & FLAG_HAS_WOL))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5201
		adapter->eeprom_wol = 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5202
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5203
	/* initialize the wol settings based on the eeprom settings */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5204
	adapter->wol = adapter->eeprom_wol;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5205
	device_set_wakeup_enable(&adapter->pdev->dev, adapter->wol);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5206
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5207
	/* save off EEPROM version number */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5208
	e1000_read_nvm(&adapter->hw, 5, 1, &adapter->eeprom_vers);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5209
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5210
	/* reset the hardware with the new settings */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5211
	e1000e_reset(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5212
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5213
	/*
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5214
	 * If the controller has AMT, do not set DRV_LOAD until the interface
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5215
	 * is up.  For all other cases, let the f/w know that the h/w is now
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5216
	 * under the control of the driver.
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5217
	 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5218
	if (!(adapter->flags & FLAG_HAS_AMT))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5219
		e1000_get_hw_control(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5220
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5221
	strcpy(netdev->name, "eth%d");
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5222
	err = register_netdev(netdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5223
	if (err)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5224
		goto err_register;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5225
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5226
	/* carrier off reporting is important to ethtool even BEFORE open */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5227
	netif_carrier_off(netdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5228
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5229
	e1000_print_device_info(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5230
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5231
	return 0;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5232
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5233
err_register:
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5234
	if (!(adapter->flags & FLAG_HAS_AMT))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5235
		e1000_release_hw_control(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5236
err_eeprom:
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5237
	if (!e1000_check_reset_block(&adapter->hw))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5238
		e1000_phy_hw_reset(&adapter->hw);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5239
err_hw_init:
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5240
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5241
	kfree(adapter->tx_ring);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5242
	kfree(adapter->rx_ring);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5243
err_sw_init:
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5244
	if (adapter->hw.flash_address)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5245
		iounmap(adapter->hw.flash_address);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5246
	e1000e_reset_interrupt_capability(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5247
err_flashmap:
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5248
	iounmap(adapter->hw.hw_addr);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5249
err_ioremap:
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5250
	free_netdev(netdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5251
err_alloc_etherdev:
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5252
	pci_release_selected_regions(pdev,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5253
	                             pci_select_bars(pdev, IORESOURCE_MEM));
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5254
err_pci_reg:
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5255
err_dma:
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5256
	pci_disable_device(pdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5257
	return err;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5258
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5259
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5260
/**
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5261
 * e1000_remove - Device Removal Routine
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5262
 * @pdev: PCI device information struct
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5263
 *
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5264
 * e1000_remove is called by the PCI subsystem to alert the driver
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5265
 * that it should release a PCI device.  The could be caused by a
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5266
 * Hot-Plug event, or because the driver is going to be removed from
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5267
 * memory.
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5268
 **/
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5269
static void __devexit e1000_remove(struct pci_dev *pdev)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5270
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5271
	struct net_device *netdev = pci_get_drvdata(pdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5272
	struct e1000_adapter *adapter = netdev_priv(netdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5273
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5274
	/*
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5275
	 * flush_scheduled work may reschedule our watchdog task, so
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5276
	 * explicitly disable watchdog tasks from being rescheduled
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5277
	 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5278
	set_bit(__E1000_DOWN, &adapter->state);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5279
	del_timer_sync(&adapter->watchdog_timer);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5280
	del_timer_sync(&adapter->phy_info_timer);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5281
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5282
	cancel_work_sync(&adapter->reset_task);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5283
	cancel_work_sync(&adapter->watchdog_task);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5284
	cancel_work_sync(&adapter->downshift_task);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5285
	cancel_work_sync(&adapter->update_phy_task);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5286
	cancel_work_sync(&adapter->print_hang_task);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5287
	flush_scheduled_work();
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5288
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5289
	if (!(netdev->flags & IFF_UP))
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5290
		e1000_power_down_phy(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5291
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5292
	unregister_netdev(netdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5293
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5294
	/*
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5295
	 * Release control of h/w to f/w.  If f/w is AMT enabled, this
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5296
	 * would have already happened in close and is redundant.
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5297
	 */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5298
	e1000_release_hw_control(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5299
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5300
	e1000e_reset_interrupt_capability(adapter);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5301
	kfree(adapter->tx_ring);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5302
	kfree(adapter->rx_ring);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5303
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5304
	iounmap(adapter->hw.hw_addr);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5305
	if (adapter->hw.flash_address)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5306
		iounmap(adapter->hw.flash_address);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5307
	pci_release_selected_regions(pdev,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5308
	                             pci_select_bars(pdev, IORESOURCE_MEM));
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5309
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5310
	free_netdev(netdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5311
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5312
	/* AER disable */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5313
	pci_disable_pcie_error_reporting(pdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5314
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5315
	pci_disable_device(pdev);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5316
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5317
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5318
/* PCI Error Recovery (ERS) */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5319
static struct pci_error_handlers e1000_err_handler = {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5320
	.error_detected = e1000_io_error_detected,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5321
	.slot_reset = e1000_io_slot_reset,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5322
	.resume = e1000_io_resume,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5323
};
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5324
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5325
static DEFINE_PCI_DEVICE_TABLE(e1000_pci_tbl) = {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5326
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82571EB_COPPER), board_82571 },
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5327
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82571EB_FIBER), board_82571 },
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5328
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82571EB_QUAD_COPPER), board_82571 },
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5329
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82571EB_QUAD_COPPER_LP), board_82571 },
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5330
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82571EB_QUAD_FIBER), board_82571 },
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5331
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82571EB_SERDES), board_82571 },
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5332
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82571EB_SERDES_DUAL), board_82571 },
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5333
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82571EB_SERDES_QUAD), board_82571 },
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5334
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82571PT_QUAD_COPPER), board_82571 },
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5335
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5336
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82572EI), board_82572 },
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5337
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82572EI_COPPER), board_82572 },
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5338
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82572EI_FIBER), board_82572 },
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5339
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82572EI_SERDES), board_82572 },
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5340
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5341
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82573E), board_82573 },
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5342
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82573E_IAMT), board_82573 },
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5343
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82573L), board_82573 },
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5344
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5345
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82574L), board_82574 },
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5346
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82574LA), board_82574 },
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5347
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82583V), board_82583 },
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5348
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5349
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_80003ES2LAN_COPPER_DPT),
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5350
	  board_80003es2lan },
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5351
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_80003ES2LAN_COPPER_SPT),
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5352
	  board_80003es2lan },
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5353
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_80003ES2LAN_SERDES_DPT),
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5354
	  board_80003es2lan },
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5355
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_80003ES2LAN_SERDES_SPT),
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5356
	  board_80003es2lan },
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5357
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5358
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH8_IFE), board_ich8lan },
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5359
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH8_IFE_G), board_ich8lan },
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5360
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH8_IFE_GT), board_ich8lan },
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5361
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH8_IGP_AMT), board_ich8lan },
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5362
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH8_IGP_C), board_ich8lan },
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5363
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH8_IGP_M), board_ich8lan },
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5364
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH8_IGP_M_AMT), board_ich8lan },
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5365
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH8_82567V_3), board_ich8lan },
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5366
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5367
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH9_IFE), board_ich9lan },
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5368
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH9_IFE_G), board_ich9lan },
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5369
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH9_IFE_GT), board_ich9lan },
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5370
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH9_IGP_AMT), board_ich9lan },
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5371
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH9_IGP_C), board_ich9lan },
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5372
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH9_BM), board_ich9lan },
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5373
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH9_IGP_M), board_ich9lan },
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5374
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH9_IGP_M_AMT), board_ich9lan },
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5375
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH9_IGP_M_V), board_ich9lan },
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5376
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5377
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH10_R_BM_LM), board_ich9lan },
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5378
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH10_R_BM_LF), board_ich9lan },
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5379
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH10_R_BM_V), board_ich9lan },
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5380
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5381
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH10_D_BM_LM), board_ich10lan },
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5382
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH10_D_BM_LF), board_ich10lan },
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5383
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5384
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH_M_HV_LM), board_pchlan },
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5385
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH_M_HV_LC), board_pchlan },
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5386
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH_D_HV_DM), board_pchlan },
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5387
	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH_D_HV_DC), board_pchlan },
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5388
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5389
	{ }	/* terminate list */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5390
};
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5391
MODULE_DEVICE_TABLE(pci, e1000_pci_tbl);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5392
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5393
/* PCI Device API Driver */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5394
static struct pci_driver e1000_driver = {
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5395
	.name     = e1000e_driver_name,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5396
	.id_table = e1000_pci_tbl,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5397
	.probe    = e1000_probe,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5398
	.remove   = __devexit_p(e1000_remove),
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5399
#ifdef CONFIG_PM
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5400
	/* Power Management Hooks */
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5401
	.suspend  = e1000_suspend,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5402
	.resume   = e1000_resume,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5403
#endif
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5404
	.shutdown = e1000_shutdown,
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5405
	.err_handler = &e1000_err_handler
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5406
};
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5407
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5408
/**
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5409
 * e1000_init_module - Driver Registration Routine
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5410
 *
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5411
 * e1000_init_module is the first routine called when the driver is
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5412
 * loaded. All it does is register with the PCI subsystem.
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5413
 **/
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5414
static int __init e1000_init_module(void)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5415
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5416
	int ret;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5417
	printk(KERN_INFO "%s: Intel(R) PRO/1000 Network Driver - %s\n",
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5418
	       e1000e_driver_name, e1000e_driver_version);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5419
	printk(KERN_INFO "%s: Copyright (c) 1999 - 2009 Intel Corporation.\n",
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5420
	       e1000e_driver_name);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5421
	ret = pci_register_driver(&e1000_driver);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5422
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5423
	return ret;
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5424
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5425
module_init(e1000_init_module);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5426
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5427
/**
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5428
 * e1000_exit_module - Driver Exit Cleanup Routine
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5429
 *
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5430
 * e1000_exit_module is called just before the driver is removed
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5431
 * from memory.
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5432
 **/
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5433
static void __exit e1000_exit_module(void)
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5434
{
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5435
	pci_unregister_driver(&e1000_driver);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5436
}
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5437
module_exit(e1000_exit_module);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5438
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5439
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5440
MODULE_AUTHOR("Intel Corporation, <linux.nics@intel.com>");
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5441
MODULE_DESCRIPTION("Intel(R) PRO/1000 Network Driver");
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5442
MODULE_LICENSE("GPL");
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5443
MODULE_VERSION(DRV_VERSION);
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5444
1baafcd263cc Added e1000e driver for 2.6.34. Thanks to Siwei Zhuang.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5445
/* e1000_main.c */