devices/e1000/e1000_main-2.6.37-ethercat.c
author Gavin Lambert <gavinl@compacsort.com>
Tue, 14 Apr 2015 09:33:24 -0400
changeset 2618 3affe9cd0b66
parent 2589 2b9c78543663
permissions -rw-r--r--
Ignore NXIO error otherwise this causes spam if network is empty or refclk not
selected yet, and syncing refclk time to master.
2173
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     1
/*******************************************************************************
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     2
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     3
  Intel PRO/1000 Linux driver
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     4
  Copyright(c) 1999 - 2006 Intel Corporation.
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     5
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     6
  This program is free software; you can redistribute it and/or modify it
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     7
  under the terms and conditions of the GNU General Public License,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     8
  version 2, as published by the Free Software Foundation.
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     9
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    10
  This program is distributed in the hope it will be useful, but WITHOUT
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    11
  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    12
  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    13
  more details.
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    14
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    15
  You should have received a copy of the GNU General Public License along with
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    16
  this program; if not, write to the Free Software Foundation, Inc.,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    17
  51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    18
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    19
  The full GNU General Public License is included in this distribution in
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    20
  the file called "COPYING".
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    21
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    22
  Contact Information:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    23
  Linux NICS <linux.nics@intel.com>
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    24
  e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    25
  Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
2589
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2284
diff changeset
    26
2173
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    27
  vim: noexpandtab
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    28
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    29
*******************************************************************************/
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    30
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    31
#include "e1000-2.6.37-ethercat.h"
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    32
#include <net/ip6_checksum.h>
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    33
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    34
char e1000_driver_name[] = "ec_e1000";
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    35
static char e1000_driver_string[] = "Intel(R) PRO/1000 Network Driver";
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    36
#define DRV_VERSION "7.3.21-k8-NAPI"
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    37
const char e1000_driver_version[] = DRV_VERSION;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    38
static const char e1000_copyright[] = "Copyright (c) 1999-2006 Intel Corporation.";
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    39
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    40
/* e1000_pci_tbl - PCI Device ID Table
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    41
 *
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    42
 * Last entry must be all 0s
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    43
 *
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    44
 * Macro expands to...
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    45
 *   {PCI_DEVICE(PCI_VENDOR_ID_INTEL, device_id)}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    46
 */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    47
static DEFINE_PCI_DEVICE_TABLE(e1000_pci_tbl) = {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    48
	INTEL_E1000_ETHERNET_DEVICE(0x1000),
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    49
	INTEL_E1000_ETHERNET_DEVICE(0x1001),
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    50
	INTEL_E1000_ETHERNET_DEVICE(0x1004),
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    51
	INTEL_E1000_ETHERNET_DEVICE(0x1008),
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    52
	INTEL_E1000_ETHERNET_DEVICE(0x1009),
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    53
	INTEL_E1000_ETHERNET_DEVICE(0x100C),
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    54
	INTEL_E1000_ETHERNET_DEVICE(0x100D),
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    55
	INTEL_E1000_ETHERNET_DEVICE(0x100E),
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    56
	INTEL_E1000_ETHERNET_DEVICE(0x100F),
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    57
	INTEL_E1000_ETHERNET_DEVICE(0x1010),
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    58
	INTEL_E1000_ETHERNET_DEVICE(0x1011),
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    59
	INTEL_E1000_ETHERNET_DEVICE(0x1012),
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    60
	INTEL_E1000_ETHERNET_DEVICE(0x1013),
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    61
	INTEL_E1000_ETHERNET_DEVICE(0x1014),
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    62
	INTEL_E1000_ETHERNET_DEVICE(0x1015),
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    63
	INTEL_E1000_ETHERNET_DEVICE(0x1016),
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    64
	INTEL_E1000_ETHERNET_DEVICE(0x1017),
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    65
	INTEL_E1000_ETHERNET_DEVICE(0x1018),
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    66
	INTEL_E1000_ETHERNET_DEVICE(0x1019),
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    67
	INTEL_E1000_ETHERNET_DEVICE(0x101A),
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    68
	INTEL_E1000_ETHERNET_DEVICE(0x101D),
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    69
	INTEL_E1000_ETHERNET_DEVICE(0x101E),
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    70
	INTEL_E1000_ETHERNET_DEVICE(0x1026),
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    71
	INTEL_E1000_ETHERNET_DEVICE(0x1027),
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    72
	INTEL_E1000_ETHERNET_DEVICE(0x1028),
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    73
	INTEL_E1000_ETHERNET_DEVICE(0x1075),
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    74
	INTEL_E1000_ETHERNET_DEVICE(0x1076),
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    75
	INTEL_E1000_ETHERNET_DEVICE(0x1077),
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    76
	INTEL_E1000_ETHERNET_DEVICE(0x1078),
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    77
	INTEL_E1000_ETHERNET_DEVICE(0x1079),
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    78
	INTEL_E1000_ETHERNET_DEVICE(0x107A),
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    79
	INTEL_E1000_ETHERNET_DEVICE(0x107B),
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    80
	INTEL_E1000_ETHERNET_DEVICE(0x107C),
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    81
	INTEL_E1000_ETHERNET_DEVICE(0x108A),
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    82
	INTEL_E1000_ETHERNET_DEVICE(0x1099),
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    83
	INTEL_E1000_ETHERNET_DEVICE(0x10B5),
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    84
	/* required last entry */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    85
	{0,}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    86
};
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    87
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    88
// do not auto-load driver
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    89
// MODULE_DEVICE_TABLE(pci, e1000_pci_tbl);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    90
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    91
int e1000_up(struct e1000_adapter *adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    92
void e1000_down(struct e1000_adapter *adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    93
void e1000_reinit_locked(struct e1000_adapter *adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    94
void e1000_reset(struct e1000_adapter *adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    95
int e1000_set_spd_dplx(struct e1000_adapter *adapter, u16 spddplx);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    96
int e1000_setup_all_tx_resources(struct e1000_adapter *adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    97
int e1000_setup_all_rx_resources(struct e1000_adapter *adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    98
void e1000_free_all_tx_resources(struct e1000_adapter *adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    99
void e1000_free_all_rx_resources(struct e1000_adapter *adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   100
static int e1000_setup_tx_resources(struct e1000_adapter *adapter,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   101
                             struct e1000_tx_ring *txdr);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   102
static int e1000_setup_rx_resources(struct e1000_adapter *adapter,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   103
                             struct e1000_rx_ring *rxdr);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   104
static void e1000_free_tx_resources(struct e1000_adapter *adapter,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   105
                             struct e1000_tx_ring *tx_ring);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   106
static void e1000_free_rx_resources(struct e1000_adapter *adapter,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   107
                             struct e1000_rx_ring *rx_ring);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   108
void e1000_update_stats(struct e1000_adapter *adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   109
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   110
static int e1000_init_module(void);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   111
static void e1000_exit_module(void);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   112
static int e1000_probe(struct pci_dev *pdev, const struct pci_device_id *ent);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   113
static void __devexit e1000_remove(struct pci_dev *pdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   114
static int e1000_alloc_queues(struct e1000_adapter *adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   115
static int e1000_sw_init(struct e1000_adapter *adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   116
static int e1000_open(struct net_device *netdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   117
static int e1000_close(struct net_device *netdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   118
static void e1000_configure_tx(struct e1000_adapter *adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   119
static void e1000_configure_rx(struct e1000_adapter *adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   120
static void e1000_setup_rctl(struct e1000_adapter *adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   121
static void e1000_clean_all_tx_rings(struct e1000_adapter *adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   122
static void e1000_clean_all_rx_rings(struct e1000_adapter *adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   123
static void e1000_clean_tx_ring(struct e1000_adapter *adapter,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   124
                                struct e1000_tx_ring *tx_ring);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   125
static void e1000_clean_rx_ring(struct e1000_adapter *adapter,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   126
                                struct e1000_rx_ring *rx_ring);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   127
static void e1000_set_rx_mode(struct net_device *netdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   128
static void e1000_update_phy_info(unsigned long data);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   129
static void e1000_update_phy_info_task(struct work_struct *work);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   130
static void e1000_watchdog(unsigned long data);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   131
static void e1000_82547_tx_fifo_stall(unsigned long data);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   132
static void e1000_82547_tx_fifo_stall_task(struct work_struct *work);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   133
static netdev_tx_t e1000_xmit_frame(struct sk_buff *skb,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   134
				    struct net_device *netdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   135
static struct net_device_stats * e1000_get_stats(struct net_device *netdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   136
static int e1000_change_mtu(struct net_device *netdev, int new_mtu);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   137
static int e1000_set_mac(struct net_device *netdev, void *p);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   138
void ec_poll(struct net_device *);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   139
static irqreturn_t e1000_intr(int irq, void *data);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   140
static bool e1000_clean_tx_irq(struct e1000_adapter *adapter,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   141
			       struct e1000_tx_ring *tx_ring);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   142
static int e1000_clean(struct napi_struct *napi, int budget);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   143
static bool e1000_clean_rx_irq(struct e1000_adapter *adapter,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   144
			       struct e1000_rx_ring *rx_ring,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   145
			       int *work_done, int work_to_do);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   146
static bool e1000_clean_jumbo_rx_irq(struct e1000_adapter *adapter,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   147
				     struct e1000_rx_ring *rx_ring,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   148
				     int *work_done, int work_to_do);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   149
static void e1000_alloc_rx_buffers(struct e1000_adapter *adapter,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   150
				   struct e1000_rx_ring *rx_ring,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   151
				   int cleaned_count);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   152
static void e1000_alloc_jumbo_rx_buffers(struct e1000_adapter *adapter,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   153
					 struct e1000_rx_ring *rx_ring,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   154
					 int cleaned_count);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   155
static int e1000_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   156
static int e1000_mii_ioctl(struct net_device *netdev, struct ifreq *ifr,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   157
			   int cmd);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   158
static void e1000_enter_82542_rst(struct e1000_adapter *adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   159
static void e1000_leave_82542_rst(struct e1000_adapter *adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   160
static void e1000_tx_timeout(struct net_device *dev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   161
static void e1000_reset_task(struct work_struct *work);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   162
static void e1000_smartspeed(struct e1000_adapter *adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   163
static int e1000_82547_fifo_workaround(struct e1000_adapter *adapter,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   164
                                       struct sk_buff *skb);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   165
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   166
static void e1000_vlan_rx_register(struct net_device *netdev, struct vlan_group *grp);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   167
static void e1000_vlan_rx_add_vid(struct net_device *netdev, u16 vid);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   168
static void e1000_vlan_rx_kill_vid(struct net_device *netdev, u16 vid);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   169
static void e1000_restore_vlan(struct e1000_adapter *adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   170
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   171
#ifdef CONFIG_PM
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   172
static int e1000_suspend(struct pci_dev *pdev, pm_message_t state);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   173
static int e1000_resume(struct pci_dev *pdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   174
#endif
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   175
static void e1000_shutdown(struct pci_dev *pdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   176
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   177
#ifdef CONFIG_NET_POLL_CONTROLLER
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   178
/* for netdump / net console */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   179
static void e1000_netpoll (struct net_device *netdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   180
#endif
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   181
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   182
#define COPYBREAK_DEFAULT 256
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   183
static unsigned int copybreak __read_mostly = COPYBREAK_DEFAULT;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   184
module_param(copybreak, uint, 0644);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   185
MODULE_PARM_DESC(copybreak,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   186
	"Maximum size of packet that is copied to a new buffer on receive");
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   187
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   188
static pci_ers_result_t e1000_io_error_detected(struct pci_dev *pdev,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   189
                     pci_channel_state_t state);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   190
static pci_ers_result_t e1000_io_slot_reset(struct pci_dev *pdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   191
static void e1000_io_resume(struct pci_dev *pdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   192
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   193
static struct pci_error_handlers e1000_err_handler = {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   194
	.error_detected = e1000_io_error_detected,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   195
	.slot_reset = e1000_io_slot_reset,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   196
	.resume = e1000_io_resume,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   197
};
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   198
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   199
static struct pci_driver e1000_driver = {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   200
	.name     = e1000_driver_name,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   201
	.id_table = e1000_pci_tbl,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   202
	.probe    = e1000_probe,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   203
	.remove   = __devexit_p(e1000_remove),
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   204
#ifdef CONFIG_PM
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   205
	/* Power Managment Hooks */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   206
	.suspend  = e1000_suspend,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   207
	.resume   = e1000_resume,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   208
#endif
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   209
	.shutdown = e1000_shutdown,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   210
	.err_handler = &e1000_err_handler
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   211
};
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   212
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   213
MODULE_AUTHOR("Florian Pose <fp@igh-essen.com>");
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   214
MODULE_DESCRIPTION("EtherCAT-capable Intel(R) PRO/1000 Network Driver");
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   215
MODULE_LICENSE("GPL");
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   216
MODULE_VERSION(DRV_VERSION);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   217
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   218
static int debug = NETIF_MSG_DRV | NETIF_MSG_PROBE;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   219
module_param(debug, int, 0);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   220
MODULE_PARM_DESC(debug, "Debug level (0=none,...,16=all)");
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   221
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   222
/**
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   223
 * e1000_get_hw_dev - return device
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   224
 * used by hardware layer to print debugging information
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   225
 *
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   226
 **/
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   227
struct net_device *e1000_get_hw_dev(struct e1000_hw *hw)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   228
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   229
	struct e1000_adapter *adapter = hw->back;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   230
	return adapter->netdev;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   231
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   232
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   233
/**
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   234
 * e1000_init_module - Driver Registration Routine
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   235
 *
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   236
 * e1000_init_module is the first routine called when the driver is
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   237
 * loaded. All it does is register with the PCI subsystem.
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   238
 **/
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   239
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   240
static int __init e1000_init_module(void)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   241
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   242
	int ret;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   243
	pr_info("%s - version %s\n", e1000_driver_string, e1000_driver_version);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   244
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   245
	pr_info("%s\n", e1000_copyright);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   246
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   247
	ret = pci_register_driver(&e1000_driver);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   248
	if (copybreak != COPYBREAK_DEFAULT) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   249
		if (copybreak == 0)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   250
			pr_info("copybreak disabled\n");
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   251
		else
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   252
			pr_info("copybreak enabled for "
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   253
				   "packets <= %u bytes\n", copybreak);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   254
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   255
	return ret;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   256
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   257
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   258
module_init(e1000_init_module);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   259
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   260
/**
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   261
 * e1000_exit_module - Driver Exit Cleanup Routine
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   262
 *
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   263
 * e1000_exit_module is called just before the driver is removed
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   264
 * from memory.
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   265
 **/
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   266
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   267
static void __exit e1000_exit_module(void)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   268
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   269
	pci_unregister_driver(&e1000_driver);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   270
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   271
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   272
module_exit(e1000_exit_module);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   273
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   274
static int e1000_request_irq(struct e1000_adapter *adapter)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   275
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   276
	struct net_device *netdev = adapter->netdev;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   277
	irq_handler_t handler = e1000_intr;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   278
	int irq_flags = IRQF_SHARED;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   279
	int err;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   280
2284
08edb009bee8 Minor: Indentation and braces.
Florian Pose <fp@igh-essen.com>
parents: 2238
diff changeset
   281
	if (adapter->ecdev) {
2173
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   282
		return 0;
2284
08edb009bee8 Minor: Indentation and braces.
Florian Pose <fp@igh-essen.com>
parents: 2238
diff changeset
   283
	}
2173
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   284
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   285
	err = request_irq(adapter->pdev->irq, handler, irq_flags, netdev->name,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   286
	                  netdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   287
	if (err) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   288
		e_err(probe, "Unable to allocate interrupt Error: %d\n", err);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   289
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   290
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   291
	return err;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   292
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   293
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   294
static void e1000_free_irq(struct e1000_adapter *adapter)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   295
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   296
	struct net_device *netdev = adapter->netdev;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   297
2284
08edb009bee8 Minor: Indentation and braces.
Florian Pose <fp@igh-essen.com>
parents: 2238
diff changeset
   298
	if (adapter->ecdev) {
2173
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   299
		return;
2284
08edb009bee8 Minor: Indentation and braces.
Florian Pose <fp@igh-essen.com>
parents: 2238
diff changeset
   300
	}
2173
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   301
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   302
	free_irq(adapter->pdev->irq, netdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   303
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   304
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   305
/**
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   306
 * e1000_irq_disable - Mask off interrupt generation on the NIC
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   307
 * @adapter: board private structure
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   308
 **/
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   309
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   310
static void e1000_irq_disable(struct e1000_adapter *adapter)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   311
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   312
	struct e1000_hw *hw = &adapter->hw;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   313
2284
08edb009bee8 Minor: Indentation and braces.
Florian Pose <fp@igh-essen.com>
parents: 2238
diff changeset
   314
	if (adapter->ecdev) {
2173
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   315
		return;
2284
08edb009bee8 Minor: Indentation and braces.
Florian Pose <fp@igh-essen.com>
parents: 2238
diff changeset
   316
	}
2173
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   317
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   318
	ew32(IMC, ~0);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   319
	E1000_WRITE_FLUSH();
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   320
	synchronize_irq(adapter->pdev->irq);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   321
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   322
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   323
/**
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   324
 * e1000_irq_enable - Enable default interrupt generation settings
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   325
 * @adapter: board private structure
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   326
 **/
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   327
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   328
static void e1000_irq_enable(struct e1000_adapter *adapter)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   329
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   330
	struct e1000_hw *hw = &adapter->hw;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   331
2284
08edb009bee8 Minor: Indentation and braces.
Florian Pose <fp@igh-essen.com>
parents: 2238
diff changeset
   332
	if (adapter->ecdev) {
2173
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   333
		return;
2284
08edb009bee8 Minor: Indentation and braces.
Florian Pose <fp@igh-essen.com>
parents: 2238
diff changeset
   334
	}
2589
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2284
diff changeset
   335
2173
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   336
	ew32(IMS, IMS_ENABLE_MASK);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   337
	E1000_WRITE_FLUSH();
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   338
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   339
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   340
static void e1000_update_mng_vlan(struct e1000_adapter *adapter)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   341
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   342
	struct e1000_hw *hw = &adapter->hw;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   343
	struct net_device *netdev = adapter->netdev;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   344
	u16 vid = hw->mng_cookie.vlan_id;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   345
	u16 old_vid = adapter->mng_vlan_id;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   346
	if (adapter->vlgrp) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   347
		if (!vlan_group_get_device(adapter->vlgrp, vid)) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   348
			if (hw->mng_cookie.status &
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   349
				E1000_MNG_DHCP_COOKIE_STATUS_VLAN_SUPPORT) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   350
				e1000_vlan_rx_add_vid(netdev, vid);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   351
				adapter->mng_vlan_id = vid;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   352
			} else
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   353
				adapter->mng_vlan_id = E1000_MNG_VLAN_NONE;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   354
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   355
			if ((old_vid != (u16)E1000_MNG_VLAN_NONE) &&
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   356
					(vid != old_vid) &&
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   357
			    !vlan_group_get_device(adapter->vlgrp, old_vid))
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   358
				e1000_vlan_rx_kill_vid(netdev, old_vid);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   359
		} else
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   360
			adapter->mng_vlan_id = vid;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   361
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   362
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   363
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   364
static void e1000_init_manageability(struct e1000_adapter *adapter)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   365
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   366
	struct e1000_hw *hw = &adapter->hw;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   367
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   368
	if (adapter->en_mng_pt) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   369
		u32 manc = er32(MANC);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   370
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   371
		/* disable hardware interception of ARP */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   372
		manc &= ~(E1000_MANC_ARP_EN);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   373
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   374
		ew32(MANC, manc);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   375
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   376
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   377
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   378
static void e1000_release_manageability(struct e1000_adapter *adapter)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   379
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   380
	struct e1000_hw *hw = &adapter->hw;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   381
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   382
	if (adapter->en_mng_pt) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   383
		u32 manc = er32(MANC);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   384
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   385
		/* re-enable hardware interception of ARP */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   386
		manc |= E1000_MANC_ARP_EN;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   387
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   388
		ew32(MANC, manc);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   389
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   390
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   391
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   392
/**
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   393
 * e1000_configure - configure the hardware for RX and TX
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   394
 * @adapter = private board structure
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   395
 **/
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   396
static void e1000_configure(struct e1000_adapter *adapter)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   397
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   398
	struct net_device *netdev = adapter->netdev;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   399
	int i;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   400
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   401
	e1000_set_rx_mode(netdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   402
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   403
	e1000_restore_vlan(adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   404
	e1000_init_manageability(adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   405
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   406
	e1000_configure_tx(adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   407
	e1000_setup_rctl(adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   408
	e1000_configure_rx(adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   409
	/* call E1000_DESC_UNUSED which always leaves
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   410
	 * at least 1 descriptor unused to make sure
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   411
	 * next_to_use != next_to_clean */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   412
	for (i = 0; i < adapter->num_rx_queues; i++) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   413
		struct e1000_rx_ring *ring = &adapter->rx_ring[i];
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   414
		if (adapter->ecdev) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   415
			/* fill rx ring completely! */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   416
			adapter->alloc_rx_buf(adapter, ring, ring->count);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   417
		} else {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   418
            /* this one leaves the last ring element unallocated! */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   419
			adapter->alloc_rx_buf(adapter, ring,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   420
					E1000_DESC_UNUSED(ring));
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   421
		}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   422
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   423
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   424
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   425
int e1000_up(struct e1000_adapter *adapter)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   426
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   427
	struct e1000_hw *hw = &adapter->hw;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   428
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   429
	/* hardware has been reset, we need to reload some things */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   430
	e1000_configure(adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   431
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   432
	clear_bit(__E1000_DOWN, &adapter->flags);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   433
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   434
	if (!adapter->ecdev) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   435
		napi_enable(&adapter->napi);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   436
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   437
		e1000_irq_enable(adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   438
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   439
		netif_wake_queue(adapter->netdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   440
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   441
		/* fire a link change interrupt to start the watchdog */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   442
		ew32(ICS, E1000_ICS_LSC);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   443
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   444
	return 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   445
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   446
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   447
/**
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   448
 * e1000_power_up_phy - restore link in case the phy was powered down
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   449
 * @adapter: address of board private structure
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   450
 *
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   451
 * The phy may be powered down to save power and turn off link when the
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   452
 * driver is unloaded and wake on lan is not enabled (among others)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   453
 * *** this routine MUST be followed by a call to e1000_reset ***
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   454
 *
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   455
 **/
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   456
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   457
void e1000_power_up_phy(struct e1000_adapter *adapter)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   458
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   459
	struct e1000_hw *hw = &adapter->hw;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   460
	u16 mii_reg = 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   461
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   462
	/* Just clear the power down bit to wake the phy back up */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   463
	if (hw->media_type == e1000_media_type_copper) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   464
		/* according to the manual, the phy will retain its
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   465
		 * settings across a power-down/up cycle */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   466
		e1000_read_phy_reg(hw, PHY_CTRL, &mii_reg);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   467
		mii_reg &= ~MII_CR_POWER_DOWN;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   468
		e1000_write_phy_reg(hw, PHY_CTRL, mii_reg);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   469
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   470
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   471
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   472
static void e1000_power_down_phy(struct e1000_adapter *adapter)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   473
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   474
	struct e1000_hw *hw = &adapter->hw;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   475
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   476
	/* Power down the PHY so no link is implied when interface is down *
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   477
	 * The PHY cannot be powered down if any of the following is true *
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   478
	 * (a) WoL is enabled
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   479
	 * (b) AMT is active
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   480
	 * (c) SoL/IDER session is active */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   481
	if (!adapter->wol && hw->mac_type >= e1000_82540 &&
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   482
	   hw->media_type == e1000_media_type_copper) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   483
		u16 mii_reg = 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   484
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   485
		switch (hw->mac_type) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   486
		case e1000_82540:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   487
		case e1000_82545:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   488
		case e1000_82545_rev_3:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   489
		case e1000_82546:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   490
		case e1000_82546_rev_3:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   491
		case e1000_82541:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   492
		case e1000_82541_rev_2:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   493
		case e1000_82547:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   494
		case e1000_82547_rev_2:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   495
			if (er32(MANC) & E1000_MANC_SMBUS_EN)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   496
				goto out;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   497
			break;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   498
		default:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   499
			goto out;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   500
		}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   501
		e1000_read_phy_reg(hw, PHY_CTRL, &mii_reg);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   502
		mii_reg |= MII_CR_POWER_DOWN;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   503
		e1000_write_phy_reg(hw, PHY_CTRL, mii_reg);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   504
		mdelay(1);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   505
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   506
out:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   507
	return;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   508
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   509
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   510
void e1000_down(struct e1000_adapter *adapter)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   511
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   512
	struct e1000_hw *hw = &adapter->hw;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   513
	struct net_device *netdev = adapter->netdev;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   514
	u32 rctl, tctl;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   515
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   516
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   517
	/* disable receives in the hardware */	
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   518
	rctl = er32(RCTL);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   519
	ew32(RCTL, rctl & ~E1000_RCTL_EN);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   520
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   521
	if (!adapter->ecdev) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   522
		/* flush and sleep below */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   523
		netif_tx_disable(netdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   524
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   525
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   526
	/* disable transmits in the hardware */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   527
	tctl = er32(TCTL);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   528
	tctl &= ~E1000_TCTL_EN;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   529
	ew32(TCTL, tctl);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   530
	/* flush both disables and wait for them to finish */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   531
	E1000_WRITE_FLUSH();
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   532
	msleep(10);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   533
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   534
	if (!adapter->ecdev) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   535
		napi_disable(&adapter->napi);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   536
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   537
		e1000_irq_disable(adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   538
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   539
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   540
	/*
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   541
	 * Setting DOWN must be after irq_disable to prevent
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   542
	 * a screaming interrupt.  Setting DOWN also prevents
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   543
	 * timers and tasks from rescheduling.
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   544
	 */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   545
	set_bit(__E1000_DOWN, &adapter->flags);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   546
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   547
	if (!adapter->ecdev) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   548
		del_timer_sync(&adapter->tx_fifo_stall_timer);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   549
		del_timer_sync(&adapter->watchdog_timer);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   550
		del_timer_sync(&adapter->phy_info_timer);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   551
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   552
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   553
	adapter->link_speed = 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   554
	adapter->link_duplex = 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   555
	if (!adapter->ecdev) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   556
		netif_carrier_off(netdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   557
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   558
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   559
	e1000_reset(adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   560
	e1000_clean_all_tx_rings(adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   561
	e1000_clean_all_rx_rings(adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   562
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   563
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   564
static void e1000_reinit_safe(struct e1000_adapter *adapter)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   565
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   566
	while (test_and_set_bit(__E1000_RESETTING, &adapter->flags))
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   567
		msleep(1);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   568
	rtnl_lock();
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   569
	e1000_down(adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   570
	e1000_up(adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   571
	rtnl_unlock();
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   572
	clear_bit(__E1000_RESETTING, &adapter->flags);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   573
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   574
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   575
void e1000_reinit_locked(struct e1000_adapter *adapter)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   576
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   577
	/* if rtnl_lock is not held the call path is bogus */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   578
	ASSERT_RTNL();
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   579
	WARN_ON(in_interrupt());
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   580
	while (test_and_set_bit(__E1000_RESETTING, &adapter->flags))
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   581
		msleep(1);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   582
	e1000_down(adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   583
	e1000_up(adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   584
	clear_bit(__E1000_RESETTING, &adapter->flags);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   585
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   586
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   587
void e1000_reset(struct e1000_adapter *adapter)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   588
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   589
	struct e1000_hw *hw = &adapter->hw;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   590
	u32 pba = 0, tx_space, min_tx_space, min_rx_space;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   591
	bool legacy_pba_adjust = false;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   592
	u16 hwm;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   593
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   594
	/* Repartition Pba for greater than 9k mtu
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   595
	 * To take effect CTRL.RST is required.
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   596
	 */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   597
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   598
	switch (hw->mac_type) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   599
	case e1000_82542_rev2_0:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   600
	case e1000_82542_rev2_1:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   601
	case e1000_82543:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   602
	case e1000_82544:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   603
	case e1000_82540:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   604
	case e1000_82541:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   605
	case e1000_82541_rev_2:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   606
		legacy_pba_adjust = true;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   607
		pba = E1000_PBA_48K;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   608
		break;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   609
	case e1000_82545:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   610
	case e1000_82545_rev_3:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   611
	case e1000_82546:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   612
	case e1000_82546_rev_3:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   613
		pba = E1000_PBA_48K;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   614
		break;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   615
	case e1000_82547:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   616
	case e1000_82547_rev_2:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   617
		legacy_pba_adjust = true;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   618
		pba = E1000_PBA_30K;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   619
		break;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   620
	case e1000_undefined:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   621
	case e1000_num_macs:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   622
		break;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   623
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   624
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   625
	if (legacy_pba_adjust) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   626
		if (hw->max_frame_size > E1000_RXBUFFER_8192)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   627
			pba -= 8; /* allocate more FIFO for Tx */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   628
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   629
		if (hw->mac_type == e1000_82547) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   630
			adapter->tx_fifo_head = 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   631
			adapter->tx_head_addr = pba << E1000_TX_HEAD_ADDR_SHIFT;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   632
			adapter->tx_fifo_size =
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   633
				(E1000_PBA_40K - pba) << E1000_PBA_BYTES_SHIFT;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   634
			atomic_set(&adapter->tx_fifo_stall, 0);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   635
		}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   636
	} else if (hw->max_frame_size >  ETH_FRAME_LEN + ETH_FCS_LEN) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   637
		/* adjust PBA for jumbo frames */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   638
		ew32(PBA, pba);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   639
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   640
		/* To maintain wire speed transmits, the Tx FIFO should be
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   641
		 * large enough to accommodate two full transmit packets,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   642
		 * rounded up to the next 1KB and expressed in KB.  Likewise,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   643
		 * the Rx FIFO should be large enough to accommodate at least
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   644
		 * one full receive packet and is similarly rounded up and
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   645
		 * expressed in KB. */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   646
		pba = er32(PBA);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   647
		/* upper 16 bits has Tx packet buffer allocation size in KB */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   648
		tx_space = pba >> 16;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   649
		/* lower 16 bits has Rx packet buffer allocation size in KB */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   650
		pba &= 0xffff;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   651
		/*
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   652
		 * the tx fifo also stores 16 bytes of information about the tx
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   653
		 * but don't include ethernet FCS because hardware appends it
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   654
		 */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   655
		min_tx_space = (hw->max_frame_size +
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   656
		                sizeof(struct e1000_tx_desc) -
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   657
		                ETH_FCS_LEN) * 2;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   658
		min_tx_space = ALIGN(min_tx_space, 1024);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   659
		min_tx_space >>= 10;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   660
		/* software strips receive CRC, so leave room for it */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   661
		min_rx_space = hw->max_frame_size;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   662
		min_rx_space = ALIGN(min_rx_space, 1024);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   663
		min_rx_space >>= 10;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   664
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   665
		/* If current Tx allocation is less than the min Tx FIFO size,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   666
		 * and the min Tx FIFO size is less than the current Rx FIFO
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   667
		 * allocation, take space away from current Rx allocation */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   668
		if (tx_space < min_tx_space &&
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   669
		    ((min_tx_space - tx_space) < pba)) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   670
			pba = pba - (min_tx_space - tx_space);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   671
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   672
			/* PCI/PCIx hardware has PBA alignment constraints */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   673
			switch (hw->mac_type) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   674
			case e1000_82545 ... e1000_82546_rev_3:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   675
				pba &= ~(E1000_PBA_8K - 1);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   676
				break;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   677
			default:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   678
				break;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   679
			}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   680
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   681
			/* if short on rx space, rx wins and must trump tx
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   682
			 * adjustment or use Early Receive if available */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   683
			if (pba < min_rx_space)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   684
				pba = min_rx_space;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   685
		}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   686
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   687
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   688
	ew32(PBA, pba);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   689
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   690
	/*
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   691
	 * flow control settings:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   692
	 * The high water mark must be low enough to fit one full frame
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   693
	 * (or the size used for early receive) above it in the Rx FIFO.
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   694
	 * Set it to the lower of:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   695
	 * - 90% of the Rx FIFO size, and
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   696
	 * - the full Rx FIFO size minus the early receive size (for parts
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   697
	 *   with ERT support assuming ERT set to E1000_ERT_2048), or
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   698
	 * - the full Rx FIFO size minus one full frame
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   699
	 */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   700
	hwm = min(((pba << 10) * 9 / 10),
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   701
		  ((pba << 10) - hw->max_frame_size));
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   702
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   703
	hw->fc_high_water = hwm & 0xFFF8;	/* 8-byte granularity */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   704
	hw->fc_low_water = hw->fc_high_water - 8;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   705
	hw->fc_pause_time = E1000_FC_PAUSE_TIME;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   706
	hw->fc_send_xon = 1;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   707
	hw->fc = hw->original_fc;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   708
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   709
	/* Allow time for pending master requests to run */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   710
	e1000_reset_hw(hw);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   711
	if (hw->mac_type >= e1000_82544)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   712
		ew32(WUC, 0);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   713
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   714
	if (e1000_init_hw(hw))
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   715
		e_dev_err("Hardware Error\n");
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   716
	e1000_update_mng_vlan(adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   717
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   718
	/* if (adapter->hwflags & HWFLAGS_PHY_PWR_BIT) { */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   719
	if (hw->mac_type >= e1000_82544 &&
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   720
	    hw->autoneg == 1 &&
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   721
	    hw->autoneg_advertised == ADVERTISE_1000_FULL) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   722
		u32 ctrl = er32(CTRL);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   723
		/* clear phy power management bit if we are in gig only mode,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   724
		 * which if enabled will attempt negotiation to 100Mb, which
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   725
		 * can cause a loss of link at power off or driver unload */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   726
		ctrl &= ~E1000_CTRL_SWDPIN3;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   727
		ew32(CTRL, ctrl);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   728
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   729
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   730
	/* Enable h/w to recognize an 802.1Q VLAN Ethernet packet */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   731
	ew32(VET, ETHERNET_IEEE_VLAN_TYPE);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   732
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   733
	e1000_reset_adaptive(hw);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   734
	e1000_phy_get_info(hw, &adapter->phy_info);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   735
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   736
	e1000_release_manageability(adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   737
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   738
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   739
/**
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   740
 *  Dump the eeprom for users having checksum issues
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   741
 **/
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   742
static void e1000_dump_eeprom(struct e1000_adapter *adapter)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   743
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   744
	struct net_device *netdev = adapter->netdev;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   745
	struct ethtool_eeprom eeprom;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   746
	const struct ethtool_ops *ops = netdev->ethtool_ops;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   747
	u8 *data;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   748
	int i;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   749
	u16 csum_old, csum_new = 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   750
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   751
	eeprom.len = ops->get_eeprom_len(netdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   752
	eeprom.offset = 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   753
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   754
	data = kmalloc(eeprom.len, GFP_KERNEL);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   755
	if (!data) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   756
		pr_err("Unable to allocate memory to dump EEPROM data\n");
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   757
		return;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   758
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   759
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   760
	ops->get_eeprom(netdev, &eeprom, data);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   761
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   762
	csum_old = (data[EEPROM_CHECKSUM_REG * 2]) +
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   763
		   (data[EEPROM_CHECKSUM_REG * 2 + 1] << 8);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   764
	for (i = 0; i < EEPROM_CHECKSUM_REG * 2; i += 2)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   765
		csum_new += data[i] + (data[i + 1] << 8);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   766
	csum_new = EEPROM_SUM - csum_new;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   767
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   768
	pr_err("/*********************/\n");
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   769
	pr_err("Current EEPROM Checksum : 0x%04x\n", csum_old);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   770
	pr_err("Calculated              : 0x%04x\n", csum_new);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   771
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   772
	pr_err("Offset    Values\n");
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   773
	pr_err("========  ======\n");
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   774
	print_hex_dump(KERN_ERR, "", DUMP_PREFIX_OFFSET, 16, 1, data, 128, 0);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   775
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   776
	pr_err("Include this output when contacting your support provider.\n");
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   777
	pr_err("This is not a software error! Something bad happened to\n");
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   778
	pr_err("your hardware or EEPROM image. Ignoring this problem could\n");
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   779
	pr_err("result in further problems, possibly loss of data,\n");
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   780
	pr_err("corruption or system hangs!\n");
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   781
	pr_err("The MAC Address will be reset to 00:00:00:00:00:00,\n");
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   782
	pr_err("which is invalid and requires you to set the proper MAC\n");
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   783
	pr_err("address manually before continuing to enable this network\n");
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   784
	pr_err("device. Please inspect the EEPROM dump and report the\n");
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   785
	pr_err("issue to your hardware vendor or Intel Customer Support.\n");
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   786
	pr_err("/*********************/\n");
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   787
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   788
	kfree(data);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   789
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   790
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   791
/**
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   792
 * e1000_is_need_ioport - determine if an adapter needs ioport resources or not
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   793
 * @pdev: PCI device information struct
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   794
 *
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   795
 * Return true if an adapter needs ioport resources
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   796
 **/
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   797
static int e1000_is_need_ioport(struct pci_dev *pdev)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   798
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   799
	switch (pdev->device) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   800
	case E1000_DEV_ID_82540EM:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   801
	case E1000_DEV_ID_82540EM_LOM:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   802
	case E1000_DEV_ID_82540EP:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   803
	case E1000_DEV_ID_82540EP_LOM:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   804
	case E1000_DEV_ID_82540EP_LP:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   805
	case E1000_DEV_ID_82541EI:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   806
	case E1000_DEV_ID_82541EI_MOBILE:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   807
	case E1000_DEV_ID_82541ER:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   808
	case E1000_DEV_ID_82541ER_LOM:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   809
	case E1000_DEV_ID_82541GI:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   810
	case E1000_DEV_ID_82541GI_LF:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   811
	case E1000_DEV_ID_82541GI_MOBILE:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   812
	case E1000_DEV_ID_82544EI_COPPER:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   813
	case E1000_DEV_ID_82544EI_FIBER:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   814
	case E1000_DEV_ID_82544GC_COPPER:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   815
	case E1000_DEV_ID_82544GC_LOM:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   816
	case E1000_DEV_ID_82545EM_COPPER:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   817
	case E1000_DEV_ID_82545EM_FIBER:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   818
	case E1000_DEV_ID_82546EB_COPPER:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   819
	case E1000_DEV_ID_82546EB_FIBER:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   820
	case E1000_DEV_ID_82546EB_QUAD_COPPER:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   821
		return true;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   822
	default:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   823
		return false;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   824
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   825
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   826
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   827
static const struct net_device_ops e1000_netdev_ops = {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   828
	.ndo_open		= e1000_open,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   829
	.ndo_stop		= e1000_close,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   830
	.ndo_start_xmit		= e1000_xmit_frame,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   831
	.ndo_get_stats		= e1000_get_stats,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   832
	.ndo_set_rx_mode	= e1000_set_rx_mode,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   833
	.ndo_set_mac_address	= e1000_set_mac,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   834
	.ndo_tx_timeout 	= e1000_tx_timeout,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   835
	.ndo_change_mtu		= e1000_change_mtu,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   836
	.ndo_do_ioctl		= e1000_ioctl,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   837
	.ndo_validate_addr	= eth_validate_addr,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   838
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   839
	.ndo_vlan_rx_register	= e1000_vlan_rx_register,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   840
	.ndo_vlan_rx_add_vid	= e1000_vlan_rx_add_vid,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   841
	.ndo_vlan_rx_kill_vid	= e1000_vlan_rx_kill_vid,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   842
#ifdef CONFIG_NET_POLL_CONTROLLER
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   843
	.ndo_poll_controller	= e1000_netpoll,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   844
#endif
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   845
};
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   846
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   847
/**
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   848
 * e1000_init_hw_struct - initialize members of hw struct
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   849
 * @adapter: board private struct
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   850
 * @hw: structure used by e1000_hw.c
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   851
 *
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   852
 * Factors out initialization of the e1000_hw struct to its own function
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   853
 * that can be called very early at init (just after struct allocation).
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   854
 * Fields are initialized based on PCI device information and
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   855
 * OS network device settings (MTU size).
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   856
 * Returns negative error codes if MAC type setup fails.
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   857
 */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   858
static int e1000_init_hw_struct(struct e1000_adapter *adapter,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   859
				struct e1000_hw *hw)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   860
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   861
	struct pci_dev *pdev = adapter->pdev;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   862
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   863
	/* PCI config space info */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   864
	hw->vendor_id = pdev->vendor;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   865
	hw->device_id = pdev->device;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   866
	hw->subsystem_vendor_id = pdev->subsystem_vendor;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   867
	hw->subsystem_id = pdev->subsystem_device;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   868
	hw->revision_id = pdev->revision;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   869
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   870
	pci_read_config_word(pdev, PCI_COMMAND, &hw->pci_cmd_word);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   871
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   872
	hw->max_frame_size = adapter->netdev->mtu +
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   873
			     ENET_HEADER_SIZE + ETHERNET_FCS_SIZE;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   874
	hw->min_frame_size = MINIMUM_ETHERNET_FRAME_SIZE;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   875
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   876
	/* identify the MAC */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   877
	if (e1000_set_mac_type(hw)) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   878
		e_err(probe, "Unknown MAC Type\n");
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   879
		return -EIO;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   880
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   881
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   882
	switch (hw->mac_type) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   883
	default:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   884
		break;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   885
	case e1000_82541:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   886
	case e1000_82547:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   887
	case e1000_82541_rev_2:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   888
	case e1000_82547_rev_2:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   889
		hw->phy_init_script = 1;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   890
		break;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   891
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   892
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   893
	e1000_set_media_type(hw);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   894
	e1000_get_bus_info(hw);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   895
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   896
	hw->wait_autoneg_complete = false;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   897
	hw->tbi_compatibility_en = true;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   898
	hw->adaptive_ifs = true;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   899
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   900
	/* Copper options */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   901
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   902
	if (hw->media_type == e1000_media_type_copper) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   903
		hw->mdix = AUTO_ALL_MODES;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   904
		hw->disable_polarity_correction = false;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   905
		hw->master_slave = E1000_MASTER_SLAVE;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   906
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   907
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   908
	return 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   909
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   910
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   911
/**
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   912
 * e1000_probe - Device Initialization Routine
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   913
 * @pdev: PCI device information struct
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   914
 * @ent: entry in e1000_pci_tbl
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   915
 *
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   916
 * Returns 0 on success, negative on failure
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   917
 *
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   918
 * e1000_probe initializes an adapter identified by a pci_dev structure.
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   919
 * The OS initialization, configuring of the adapter private structure,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   920
 * and a hardware reset occur.
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   921
 **/
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   922
static int __devinit e1000_probe(struct pci_dev *pdev,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   923
				 const struct pci_device_id *ent)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   924
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   925
	struct net_device *netdev;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   926
	struct e1000_adapter *adapter;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   927
	struct e1000_hw *hw;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   928
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   929
	static int cards_found = 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   930
	static int global_quad_port_a = 0; /* global ksp3 port a indication */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   931
	int i, err, pci_using_dac;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   932
	u16 eeprom_data = 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   933
	u16 eeprom_apme_mask = E1000_EEPROM_APME;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   934
	int bars, need_ioport;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   935
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   936
	/* do not allocate ioport bars when not needed */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   937
	need_ioport = e1000_is_need_ioport(pdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   938
	if (need_ioport) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   939
		bars = pci_select_bars(pdev, IORESOURCE_MEM | IORESOURCE_IO);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   940
		err = pci_enable_device(pdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   941
	} else {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   942
		bars = pci_select_bars(pdev, IORESOURCE_MEM);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   943
		err = pci_enable_device_mem(pdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   944
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   945
	if (err)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   946
		return err;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   947
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   948
	err = pci_request_selected_regions(pdev, bars, e1000_driver_name);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   949
	if (err)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   950
		goto err_pci_reg;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   951
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   952
	pci_set_master(pdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   953
	err = pci_save_state(pdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   954
	if (err)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   955
		goto err_alloc_etherdev;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   956
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   957
	err = -ENOMEM;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   958
	netdev = alloc_etherdev(sizeof(struct e1000_adapter));
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   959
	if (!netdev)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   960
		goto err_alloc_etherdev;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   961
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   962
	SET_NETDEV_DEV(netdev, &pdev->dev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   963
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   964
	pci_set_drvdata(pdev, netdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   965
	adapter = netdev_priv(netdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   966
	adapter->netdev = netdev;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   967
	adapter->pdev = pdev;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   968
	adapter->msg_enable = (1 << debug) - 1;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   969
	adapter->bars = bars;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   970
	adapter->need_ioport = need_ioport;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   971
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   972
	hw = &adapter->hw;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   973
	hw->back = adapter;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   974
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   975
	err = -EIO;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   976
	hw->hw_addr = pci_ioremap_bar(pdev, BAR_0);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   977
	if (!hw->hw_addr)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   978
		goto err_ioremap;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   979
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   980
	if (adapter->need_ioport) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   981
		for (i = BAR_1; i <= BAR_5; i++) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   982
			if (pci_resource_len(pdev, i) == 0)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   983
				continue;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   984
			if (pci_resource_flags(pdev, i) & IORESOURCE_IO) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   985
				hw->io_base = pci_resource_start(pdev, i);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   986
				break;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   987
			}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   988
		}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   989
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   990
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   991
	/* make ready for any if (hw->...) below */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   992
	err = e1000_init_hw_struct(adapter, hw);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   993
	if (err)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   994
		goto err_sw_init;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   995
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   996
	/*
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   997
	 * there is a workaround being applied below that limits
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   998
	 * 64-bit DMA addresses to 64-bit hardware.  There are some
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   999
	 * 32-bit adapters that Tx hang when given 64-bit DMA addresses
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1000
	 */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1001
	pci_using_dac = 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1002
	if ((hw->bus_type == e1000_bus_type_pcix) &&
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1003
	    !dma_set_mask(&pdev->dev, DMA_BIT_MASK(64))) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1004
		/*
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1005
		 * according to DMA-API-HOWTO, coherent calls will always
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1006
		 * succeed if the set call did
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1007
		 */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1008
		dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(64));
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1009
		pci_using_dac = 1;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1010
	} else {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1011
		err = dma_set_mask(&pdev->dev, DMA_BIT_MASK(32));
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1012
		if (err) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1013
			pr_err("No usable DMA config, aborting\n");
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1014
			goto err_dma;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1015
		}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1016
		dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(32));
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1017
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1018
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1019
	netdev->netdev_ops = &e1000_netdev_ops;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1020
	e1000_set_ethtool_ops(netdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1021
	netdev->watchdog_timeo = 5 * HZ;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1022
	netif_napi_add(netdev, &adapter->napi, e1000_clean, 64);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1023
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1024
	strncpy(netdev->name, pci_name(pdev), sizeof(netdev->name) - 1);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1025
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1026
	adapter->bd_number = cards_found;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1027
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1028
	/* setup the private structure */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1029
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1030
	err = e1000_sw_init(adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1031
	if (err)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1032
		goto err_sw_init;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1033
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1034
	err = -EIO;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1035
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1036
	if (hw->mac_type >= e1000_82543) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1037
		netdev->features = NETIF_F_SG |
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1038
				   NETIF_F_HW_CSUM |
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1039
				   NETIF_F_HW_VLAN_TX |
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1040
				   NETIF_F_HW_VLAN_RX |
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1041
				   NETIF_F_HW_VLAN_FILTER;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1042
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1043
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1044
	if ((hw->mac_type >= e1000_82544) &&
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1045
	   (hw->mac_type != e1000_82547))
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1046
		netdev->features |= NETIF_F_TSO;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1047
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1048
	if (pci_using_dac) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1049
		netdev->features |= NETIF_F_HIGHDMA;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1050
		netdev->vlan_features |= NETIF_F_HIGHDMA;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1051
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1052
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1053
	netdev->vlan_features |= NETIF_F_TSO;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1054
	netdev->vlan_features |= NETIF_F_HW_CSUM;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1055
	netdev->vlan_features |= NETIF_F_SG;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1056
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1057
	adapter->en_mng_pt = e1000_enable_mng_pass_thru(hw);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1058
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1059
	/* initialize eeprom parameters */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1060
	if (e1000_init_eeprom_params(hw)) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1061
		e_err(probe, "EEPROM initialization failed\n");
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1062
		goto err_eeprom;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1063
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1064
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1065
	/* before reading the EEPROM, reset the controller to
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1066
	 * put the device in a known good starting state */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1067
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1068
	e1000_reset_hw(hw);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1069
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1070
	/* make sure the EEPROM is good */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1071
	if (e1000_validate_eeprom_checksum(hw) < 0) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1072
		e_err(probe, "The EEPROM Checksum Is Not Valid\n");
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1073
		e1000_dump_eeprom(adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1074
		/*
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1075
		 * set MAC address to all zeroes to invalidate and temporary
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1076
		 * disable this device for the user. This blocks regular
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1077
		 * traffic while still permitting ethtool ioctls from reaching
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1078
		 * the hardware as well as allowing the user to run the
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1079
		 * interface after manually setting a hw addr using
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1080
		 * `ip set address`
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1081
		 */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1082
		memset(hw->mac_addr, 0, netdev->addr_len);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1083
	} else {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1084
		/* copy the MAC address out of the EEPROM */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1085
		if (e1000_read_mac_addr(hw))
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1086
			e_err(probe, "EEPROM Read Error\n");
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1087
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1088
	/* don't block initalization here due to bad MAC address */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1089
	memcpy(netdev->dev_addr, hw->mac_addr, netdev->addr_len);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1090
	memcpy(netdev->perm_addr, hw->mac_addr, netdev->addr_len);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1091
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1092
	if (!is_valid_ether_addr(netdev->perm_addr))
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1093
		e_err(probe, "Invalid MAC Address\n");
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1094
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1095
	init_timer(&adapter->tx_fifo_stall_timer);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1096
	adapter->tx_fifo_stall_timer.function = e1000_82547_tx_fifo_stall;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1097
	adapter->tx_fifo_stall_timer.data = (unsigned long)adapter;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1098
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1099
	init_timer(&adapter->watchdog_timer);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1100
	adapter->watchdog_timer.function = e1000_watchdog;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1101
	adapter->watchdog_timer.data = (unsigned long) adapter;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1102
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1103
	init_timer(&adapter->phy_info_timer);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1104
	adapter->phy_info_timer.function = e1000_update_phy_info;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1105
	adapter->phy_info_timer.data = (unsigned long)adapter;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1106
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1107
	INIT_WORK(&adapter->fifo_stall_task, e1000_82547_tx_fifo_stall_task);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1108
	INIT_WORK(&adapter->reset_task, e1000_reset_task);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1109
	INIT_WORK(&adapter->phy_info_task, e1000_update_phy_info_task);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1110
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1111
	e1000_check_options(adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1112
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1113
	/* Initial Wake on LAN setting
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1114
	 * If APM wake is enabled in the EEPROM,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1115
	 * enable the ACPI Magic Packet filter
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1116
	 */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1117
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1118
	switch (hw->mac_type) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1119
	case e1000_82542_rev2_0:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1120
	case e1000_82542_rev2_1:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1121
	case e1000_82543:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1122
		break;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1123
	case e1000_82544:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1124
		e1000_read_eeprom(hw,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1125
			EEPROM_INIT_CONTROL2_REG, 1, &eeprom_data);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1126
		eeprom_apme_mask = E1000_EEPROM_82544_APM;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1127
		break;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1128
	case e1000_82546:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1129
	case e1000_82546_rev_3:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1130
		if (er32(STATUS) & E1000_STATUS_FUNC_1){
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1131
			e1000_read_eeprom(hw,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1132
				EEPROM_INIT_CONTROL3_PORT_B, 1, &eeprom_data);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1133
			break;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1134
		}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1135
		/* Fall Through */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1136
	default:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1137
		e1000_read_eeprom(hw,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1138
			EEPROM_INIT_CONTROL3_PORT_A, 1, &eeprom_data);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1139
		break;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1140
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1141
	if (eeprom_data & eeprom_apme_mask)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1142
		adapter->eeprom_wol |= E1000_WUFC_MAG;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1143
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1144
	/* now that we have the eeprom settings, apply the special cases
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1145
	 * where the eeprom may be wrong or the board simply won't support
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1146
	 * wake on lan on a particular port */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1147
	switch (pdev->device) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1148
	case E1000_DEV_ID_82546GB_PCIE:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1149
		adapter->eeprom_wol = 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1150
		break;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1151
	case E1000_DEV_ID_82546EB_FIBER:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1152
	case E1000_DEV_ID_82546GB_FIBER:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1153
		/* Wake events only supported on port A for dual fiber
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1154
		 * regardless of eeprom setting */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1155
		if (er32(STATUS) & E1000_STATUS_FUNC_1)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1156
			adapter->eeprom_wol = 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1157
		break;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1158
	case E1000_DEV_ID_82546GB_QUAD_COPPER_KSP3:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1159
		/* if quad port adapter, disable WoL on all but port A */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1160
		if (global_quad_port_a != 0)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1161
			adapter->eeprom_wol = 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1162
		else
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1163
			adapter->quad_port_a = 1;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1164
		/* Reset for multiple quad port adapters */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1165
		if (++global_quad_port_a == 4)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1166
			global_quad_port_a = 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1167
		break;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1168
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1169
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1170
	/* initialize the wol settings based on the eeprom settings */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1171
	adapter->wol = adapter->eeprom_wol;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1172
	device_set_wakeup_enable(&adapter->pdev->dev, adapter->wol);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1173
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1174
	/* reset the hardware with the new settings */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1175
	e1000_reset(adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1176
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1177
 	// offer device to EtherCAT master module
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1178
	adapter->ecdev = ecdev_offer(netdev, ec_poll, THIS_MODULE);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1179
	if (adapter->ecdev) {
2589
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2284
diff changeset
  1180
		err = ecdev_open(adapter->ecdev);
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2284
diff changeset
  1181
		if (err) {
2173
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1182
			ecdev_withdraw(adapter->ecdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1183
			goto err_register;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1184
		}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1185
	} else {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1186
		strcpy(netdev->name, "eth%d");
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1187
		err = register_netdev(netdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1188
		if (err)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1189
			goto err_register;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1190
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1191
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1192
	/* print bus type/speed/width info */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1193
	e_info(probe, "(PCI%s:%dMHz:%d-bit) %pM\n",
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1194
	       ((hw->bus_type == e1000_bus_type_pcix) ? "-X" : ""),
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1195
	       ((hw->bus_speed == e1000_bus_speed_133) ? 133 :
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1196
		(hw->bus_speed == e1000_bus_speed_120) ? 120 :
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1197
		(hw->bus_speed == e1000_bus_speed_100) ? 100 :
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1198
		(hw->bus_speed == e1000_bus_speed_66) ? 66 : 33),
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1199
	       ((hw->bus_width == e1000_bus_width_64) ? 64 : 32),
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1200
	       netdev->dev_addr);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1201
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1202
	if (!adapter->ecdev) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1203
		/* carrier off reporting is important to ethtool even BEFORE open */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1204
		netif_carrier_off(netdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1205
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1206
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1207
	e_info(probe, "Intel(R) PRO/1000 Network Connection\n");
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1208
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1209
	cards_found++;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1210
	return 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1211
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1212
err_register:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1213
err_eeprom:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1214
	e1000_phy_hw_reset(hw);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1215
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1216
	if (hw->flash_address)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1217
		iounmap(hw->flash_address);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1218
	kfree(adapter->tx_ring);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1219
	kfree(adapter->rx_ring);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1220
err_dma:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1221
err_sw_init:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1222
	iounmap(hw->hw_addr);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1223
err_ioremap:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1224
	free_netdev(netdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1225
err_alloc_etherdev:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1226
	pci_release_selected_regions(pdev, bars);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1227
err_pci_reg:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1228
	pci_disable_device(pdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1229
	return err;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1230
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1231
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1232
/**
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1233
 * e1000_remove - Device Removal Routine
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1234
 * @pdev: PCI device information struct
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1235
 *
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1236
 * e1000_remove is called by the PCI subsystem to alert the driver
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1237
 * that it should release a PCI device.  The could be caused by a
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1238
 * Hot-Plug event, or because the driver is going to be removed from
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1239
 * memory.
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1240
 **/
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1241
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1242
static void __devexit e1000_remove(struct pci_dev *pdev)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1243
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1244
	struct net_device *netdev = pci_get_drvdata(pdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1245
	struct e1000_adapter *adapter = netdev_priv(netdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1246
	struct e1000_hw *hw = &adapter->hw;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1247
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1248
	set_bit(__E1000_DOWN, &adapter->flags);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1249
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1250
	if (!adapter->ecdev) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1251
		del_timer_sync(&adapter->tx_fifo_stall_timer);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1252
		del_timer_sync(&adapter->watchdog_timer);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1253
		del_timer_sync(&adapter->phy_info_timer);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1254
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1255
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1256
	cancel_work_sync(&adapter->reset_task);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1257
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1258
	e1000_release_manageability(adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1259
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1260
	if (adapter->ecdev) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1261
		ecdev_close(adapter->ecdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1262
		ecdev_withdraw(adapter->ecdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1263
	} else {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1264
		unregister_netdev(netdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1265
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1266
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1267
	e1000_phy_hw_reset(hw);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1268
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1269
	kfree(adapter->tx_ring);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1270
	kfree(adapter->rx_ring);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1271
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1272
	iounmap(hw->hw_addr);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1273
	if (hw->flash_address)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1274
		iounmap(hw->flash_address);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1275
	pci_release_selected_regions(pdev, adapter->bars);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1276
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1277
	free_netdev(netdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1278
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1279
	pci_disable_device(pdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1280
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1281
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1282
/**
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1283
 * e1000_sw_init - Initialize general software structures (struct e1000_adapter)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1284
 * @adapter: board private structure to initialize
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1285
 *
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1286
 * e1000_sw_init initializes the Adapter private data structure.
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1287
 * e1000_init_hw_struct MUST be called before this function
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1288
 **/
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1289
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1290
static int __devinit e1000_sw_init(struct e1000_adapter *adapter)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1291
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1292
	adapter->rx_buffer_len = MAXIMUM_ETHERNET_VLAN_SIZE;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1293
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1294
	adapter->num_tx_queues = 1;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1295
	adapter->num_rx_queues = 1;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1296
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1297
	if (e1000_alloc_queues(adapter)) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1298
		e_err(probe, "Unable to allocate memory for queues\n");
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1299
		return -ENOMEM;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1300
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1301
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1302
	/* Explicitly disable IRQ since the NIC can be in any state. */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1303
	e1000_irq_disable(adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1304
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1305
	spin_lock_init(&adapter->stats_lock);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1306
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1307
	set_bit(__E1000_DOWN, &adapter->flags);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1308
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1309
	return 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1310
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1311
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1312
/**
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1313
 * e1000_alloc_queues - Allocate memory for all rings
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1314
 * @adapter: board private structure to initialize
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1315
 *
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1316
 * We allocate one ring per queue at run-time since we don't know the
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1317
 * number of queues at compile-time.
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1318
 **/
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1319
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1320
static int __devinit e1000_alloc_queues(struct e1000_adapter *adapter)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1321
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1322
	adapter->tx_ring = kcalloc(adapter->num_tx_queues,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1323
	                           sizeof(struct e1000_tx_ring), GFP_KERNEL);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1324
	if (!adapter->tx_ring)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1325
		return -ENOMEM;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1326
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1327
	adapter->rx_ring = kcalloc(adapter->num_rx_queues,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1328
	                           sizeof(struct e1000_rx_ring), GFP_KERNEL);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1329
	if (!adapter->rx_ring) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1330
		kfree(adapter->tx_ring);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1331
		return -ENOMEM;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1332
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1333
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1334
	return E1000_SUCCESS;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1335
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1336
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1337
/**
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1338
 * e1000_open - Called when a network interface is made active
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1339
 * @netdev: network interface device structure
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1340
 *
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1341
 * Returns 0 on success, negative value on failure
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1342
 *
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1343
 * The open entry point is called when a network interface is made
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1344
 * active by the system (IFF_UP).  At this point all resources needed
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1345
 * for transmit and receive operations are allocated, the interrupt
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1346
 * handler is registered with the OS, the watchdog timer is started,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1347
 * and the stack is notified that the interface is ready.
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1348
 **/
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1349
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1350
static int e1000_open(struct net_device *netdev)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1351
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1352
	struct e1000_adapter *adapter = netdev_priv(netdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1353
	struct e1000_hw *hw = &adapter->hw;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1354
	int err;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1355
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1356
	/* disallow open during test */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1357
	if (test_bit(__E1000_TESTING, &adapter->flags))
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1358
		return -EBUSY;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1359
2589
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2284
diff changeset
  1360
	if (!adapter->ecdev) {
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2284
diff changeset
  1361
		netif_carrier_off(netdev);
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2284
diff changeset
  1362
	}
2173
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1363
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1364
	/* allocate transmit descriptors */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1365
	err = e1000_setup_all_tx_resources(adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1366
	if (err)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1367
		goto err_setup_tx;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1368
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1369
	/* allocate receive descriptors */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1370
	err = e1000_setup_all_rx_resources(adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1371
	if (err)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1372
		goto err_setup_rx;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1373
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1374
	e1000_power_up_phy(adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1375
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1376
	adapter->mng_vlan_id = E1000_MNG_VLAN_NONE;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1377
	if ((hw->mng_cookie.status &
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1378
			  E1000_MNG_DHCP_COOKIE_STATUS_VLAN_SUPPORT)) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1379
		e1000_update_mng_vlan(adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1380
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1381
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1382
	/* before we allocate an interrupt, we must be ready to handle it.
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1383
	 * Setting DEBUG_SHIRQ in the kernel makes it fire an interrupt
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1384
	 * as soon as we call pci_request_irq, so we have to setup our
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1385
	 * clean_rx handler before we do so.  */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1386
	e1000_configure(adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1387
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1388
	err = e1000_request_irq(adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1389
	if (err)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1390
		goto err_req_irq;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1391
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1392
	/* From here on the code is the same as e1000_up() */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1393
	clear_bit(__E1000_DOWN, &adapter->flags);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1394
2589
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2284
diff changeset
  1395
	if (!adapter->ecdev) {
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2284
diff changeset
  1396
		napi_enable(&adapter->napi);
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2284
diff changeset
  1397
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2284
diff changeset
  1398
		e1000_irq_enable(adapter);
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2284
diff changeset
  1399
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2284
diff changeset
  1400
		netif_start_queue(netdev);
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2284
diff changeset
  1401
	}
2173
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1402
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1403
	/* fire a link status change interrupt to start the watchdog */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1404
	ew32(ICS, E1000_ICS_LSC);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1405
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1406
	return E1000_SUCCESS;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1407
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1408
err_req_irq:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1409
	e1000_power_down_phy(adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1410
	e1000_free_all_rx_resources(adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1411
err_setup_rx:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1412
	e1000_free_all_tx_resources(adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1413
err_setup_tx:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1414
	e1000_reset(adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1415
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1416
	return err;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1417
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1418
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1419
/**
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1420
 * e1000_close - Disables a network interface
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1421
 * @netdev: network interface device structure
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1422
 *
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1423
 * Returns 0, this is not allowed to fail
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1424
 *
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1425
 * The close entry point is called when an interface is de-activated
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1426
 * by the OS.  The hardware is still under the drivers control, but
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1427
 * needs to be disabled.  A global MAC reset is issued to stop the
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1428
 * hardware, and all transmit and receive resources are freed.
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1429
 **/
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1430
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1431
static int e1000_close(struct net_device *netdev)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1432
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1433
	struct e1000_adapter *adapter = netdev_priv(netdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1434
	struct e1000_hw *hw = &adapter->hw;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1435
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1436
	WARN_ON(test_bit(__E1000_RESETTING, &adapter->flags));
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1437
	e1000_down(adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1438
	e1000_power_down_phy(adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1439
	e1000_free_irq(adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1440
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1441
	e1000_free_all_tx_resources(adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1442
	e1000_free_all_rx_resources(adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1443
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1444
	/* kill manageability vlan ID if supported, but not if a vlan with
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1445
	 * the same ID is registered on the host OS (let 8021q kill it) */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1446
	if ((hw->mng_cookie.status &
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1447
			  E1000_MNG_DHCP_COOKIE_STATUS_VLAN_SUPPORT) &&
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1448
	     !(adapter->vlgrp &&
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1449
	       vlan_group_get_device(adapter->vlgrp, adapter->mng_vlan_id))) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1450
		e1000_vlan_rx_kill_vid(netdev, adapter->mng_vlan_id);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1451
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1452
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1453
	return 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1454
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1455
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1456
/**
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1457
 * e1000_check_64k_bound - check that memory doesn't cross 64kB boundary
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1458
 * @adapter: address of board private structure
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1459
 * @start: address of beginning of memory
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1460
 * @len: length of memory
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1461
 **/
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1462
static bool e1000_check_64k_bound(struct e1000_adapter *adapter, void *start,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1463
				  unsigned long len)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1464
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1465
	struct e1000_hw *hw = &adapter->hw;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1466
	unsigned long begin = (unsigned long)start;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1467
	unsigned long end = begin + len;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1468
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1469
	/* First rev 82545 and 82546 need to not allow any memory
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1470
	 * write location to cross 64k boundary due to errata 23 */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1471
	if (hw->mac_type == e1000_82545 ||
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1472
	    hw->mac_type == e1000_82546) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1473
		return ((begin ^ (end - 1)) >> 16) != 0 ? false : true;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1474
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1475
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1476
	return true;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1477
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1478
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1479
/**
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1480
 * e1000_setup_tx_resources - allocate Tx resources (Descriptors)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1481
 * @adapter: board private structure
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1482
 * @txdr:    tx descriptor ring (for a specific queue) to setup
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1483
 *
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1484
 * Return 0 on success, negative on failure
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1485
 **/
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1486
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1487
static int e1000_setup_tx_resources(struct e1000_adapter *adapter,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1488
				    struct e1000_tx_ring *txdr)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1489
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1490
	struct pci_dev *pdev = adapter->pdev;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1491
	int size;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1492
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1493
	size = sizeof(struct e1000_buffer) * txdr->count;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1494
	txdr->buffer_info = vmalloc(size);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1495
	if (!txdr->buffer_info) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1496
		e_err(probe, "Unable to allocate memory for the Tx descriptor "
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1497
		      "ring\n");
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1498
		return -ENOMEM;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1499
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1500
	memset(txdr->buffer_info, 0, size);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1501
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1502
	/* round up to nearest 4K */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1503
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1504
	txdr->size = txdr->count * sizeof(struct e1000_tx_desc);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1505
	txdr->size = ALIGN(txdr->size, 4096);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1506
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1507
	txdr->desc = dma_alloc_coherent(&pdev->dev, txdr->size, &txdr->dma,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1508
					GFP_KERNEL);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1509
	if (!txdr->desc) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1510
setup_tx_desc_die:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1511
		vfree(txdr->buffer_info);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1512
		e_err(probe, "Unable to allocate memory for the Tx descriptor "
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1513
		      "ring\n");
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1514
		return -ENOMEM;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1515
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1516
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1517
	/* Fix for errata 23, can't cross 64kB boundary */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1518
	if (!e1000_check_64k_bound(adapter, txdr->desc, txdr->size)) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1519
		void *olddesc = txdr->desc;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1520
		dma_addr_t olddma = txdr->dma;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1521
		e_err(tx_err, "txdr align check failed: %u bytes at %p\n",
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1522
		      txdr->size, txdr->desc);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1523
		/* Try again, without freeing the previous */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1524
		txdr->desc = dma_alloc_coherent(&pdev->dev, txdr->size,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1525
						&txdr->dma, GFP_KERNEL);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1526
		/* Failed allocation, critical failure */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1527
		if (!txdr->desc) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1528
			dma_free_coherent(&pdev->dev, txdr->size, olddesc,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1529
					  olddma);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1530
			goto setup_tx_desc_die;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1531
		}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1532
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1533
		if (!e1000_check_64k_bound(adapter, txdr->desc, txdr->size)) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1534
			/* give up */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1535
			dma_free_coherent(&pdev->dev, txdr->size, txdr->desc,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1536
					  txdr->dma);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1537
			dma_free_coherent(&pdev->dev, txdr->size, olddesc,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1538
					  olddma);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1539
			e_err(probe, "Unable to allocate aligned memory "
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1540
			      "for the transmit descriptor ring\n");
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1541
			vfree(txdr->buffer_info);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1542
			return -ENOMEM;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1543
		} else {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1544
			/* Free old allocation, new allocation was successful */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1545
			dma_free_coherent(&pdev->dev, txdr->size, olddesc,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1546
					  olddma);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1547
		}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1548
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1549
	memset(txdr->desc, 0, txdr->size);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1550
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1551
	txdr->next_to_use = 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1552
	txdr->next_to_clean = 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1553
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1554
	return 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1555
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1556
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1557
/**
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1558
 * e1000_setup_all_tx_resources - wrapper to allocate Tx resources
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1559
 * 				  (Descriptors) for all queues
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1560
 * @adapter: board private structure
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1561
 *
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1562
 * Return 0 on success, negative on failure
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1563
 **/
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1564
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1565
int e1000_setup_all_tx_resources(struct e1000_adapter *adapter)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1566
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1567
	int i, err = 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1568
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1569
	for (i = 0; i < adapter->num_tx_queues; i++) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1570
		err = e1000_setup_tx_resources(adapter, &adapter->tx_ring[i]);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1571
		if (err) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1572
			e_err(probe, "Allocation for Tx Queue %u failed\n", i);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1573
			for (i-- ; i >= 0; i--)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1574
				e1000_free_tx_resources(adapter,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1575
							&adapter->tx_ring[i]);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1576
			break;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1577
		}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1578
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1579
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1580
	return err;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1581
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1582
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1583
/**
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1584
 * e1000_configure_tx - Configure 8254x Transmit Unit after Reset
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1585
 * @adapter: board private structure
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1586
 *
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1587
 * Configure the Tx unit of the MAC after a reset.
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1588
 **/
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1589
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1590
static void e1000_configure_tx(struct e1000_adapter *adapter)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1591
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1592
	u64 tdba;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1593
	struct e1000_hw *hw = &adapter->hw;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1594
	u32 tdlen, tctl, tipg;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1595
	u32 ipgr1, ipgr2;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1596
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1597
	/* Setup the HW Tx Head and Tail descriptor pointers */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1598
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1599
	switch (adapter->num_tx_queues) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1600
	case 1:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1601
	default:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1602
		tdba = adapter->tx_ring[0].dma;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1603
		tdlen = adapter->tx_ring[0].count *
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1604
			sizeof(struct e1000_tx_desc);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1605
		ew32(TDLEN, tdlen);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1606
		ew32(TDBAH, (tdba >> 32));
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1607
		ew32(TDBAL, (tdba & 0x00000000ffffffffULL));
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1608
		ew32(TDT, 0);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1609
		ew32(TDH, 0);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1610
		adapter->tx_ring[0].tdh = ((hw->mac_type >= e1000_82543) ? E1000_TDH : E1000_82542_TDH);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1611
		adapter->tx_ring[0].tdt = ((hw->mac_type >= e1000_82543) ? E1000_TDT : E1000_82542_TDT);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1612
		break;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1613
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1614
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1615
	/* Set the default values for the Tx Inter Packet Gap timer */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1616
	if ((hw->media_type == e1000_media_type_fiber ||
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1617
	     hw->media_type == e1000_media_type_internal_serdes))
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1618
		tipg = DEFAULT_82543_TIPG_IPGT_FIBER;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1619
	else
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1620
		tipg = DEFAULT_82543_TIPG_IPGT_COPPER;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1621
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1622
	switch (hw->mac_type) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1623
	case e1000_82542_rev2_0:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1624
	case e1000_82542_rev2_1:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1625
		tipg = DEFAULT_82542_TIPG_IPGT;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1626
		ipgr1 = DEFAULT_82542_TIPG_IPGR1;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1627
		ipgr2 = DEFAULT_82542_TIPG_IPGR2;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1628
		break;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1629
	default:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1630
		ipgr1 = DEFAULT_82543_TIPG_IPGR1;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1631
		ipgr2 = DEFAULT_82543_TIPG_IPGR2;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1632
		break;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1633
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1634
	tipg |= ipgr1 << E1000_TIPG_IPGR1_SHIFT;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1635
	tipg |= ipgr2 << E1000_TIPG_IPGR2_SHIFT;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1636
	ew32(TIPG, tipg);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1637
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1638
	/* Set the Tx Interrupt Delay register */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1639
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1640
	ew32(TIDV, adapter->tx_int_delay);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1641
	if (hw->mac_type >= e1000_82540)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1642
		ew32(TADV, adapter->tx_abs_int_delay);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1643
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1644
	/* Program the Transmit Control Register */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1645
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1646
	tctl = er32(TCTL);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1647
	tctl &= ~E1000_TCTL_CT;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1648
	tctl |= E1000_TCTL_PSP | E1000_TCTL_RTLC |
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1649
		(E1000_COLLISION_THRESHOLD << E1000_CT_SHIFT);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1650
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1651
	e1000_config_collision_dist(hw);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1652
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1653
	/* Setup Transmit Descriptor Settings for eop descriptor */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1654
	adapter->txd_cmd = E1000_TXD_CMD_EOP | E1000_TXD_CMD_IFCS;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1655
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1656
	/* only set IDE if we are delaying interrupts using the timers */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1657
	if (adapter->tx_int_delay)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1658
		adapter->txd_cmd |= E1000_TXD_CMD_IDE;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1659
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1660
	if (hw->mac_type < e1000_82543)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1661
		adapter->txd_cmd |= E1000_TXD_CMD_RPS;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1662
	else
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1663
		adapter->txd_cmd |= E1000_TXD_CMD_RS;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1664
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1665
	/* Cache if we're 82544 running in PCI-X because we'll
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1666
	 * need this to apply a workaround later in the send path. */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1667
	if (hw->mac_type == e1000_82544 &&
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1668
	    hw->bus_type == e1000_bus_type_pcix)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1669
		adapter->pcix_82544 = 1;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1670
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1671
	ew32(TCTL, tctl);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1672
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1673
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1674
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1675
/**
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1676
 * e1000_setup_rx_resources - allocate Rx resources (Descriptors)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1677
 * @adapter: board private structure
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1678
 * @rxdr:    rx descriptor ring (for a specific queue) to setup
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1679
 *
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1680
 * Returns 0 on success, negative on failure
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1681
 **/
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1682
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1683
static int e1000_setup_rx_resources(struct e1000_adapter *adapter,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1684
				    struct e1000_rx_ring *rxdr)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1685
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1686
	struct pci_dev *pdev = adapter->pdev;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1687
	int size, desc_len;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1688
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1689
	size = sizeof(struct e1000_buffer) * rxdr->count;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1690
	rxdr->buffer_info = vmalloc(size);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1691
	if (!rxdr->buffer_info) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1692
		e_err(probe, "Unable to allocate memory for the Rx descriptor "
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1693
		      "ring\n");
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1694
		return -ENOMEM;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1695
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1696
	memset(rxdr->buffer_info, 0, size);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1697
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1698
	desc_len = sizeof(struct e1000_rx_desc);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1699
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1700
	/* Round up to nearest 4K */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1701
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1702
	rxdr->size = rxdr->count * desc_len;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1703
	rxdr->size = ALIGN(rxdr->size, 4096);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1704
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1705
	rxdr->desc = dma_alloc_coherent(&pdev->dev, rxdr->size, &rxdr->dma,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1706
					GFP_KERNEL);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1707
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1708
	if (!rxdr->desc) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1709
		e_err(probe, "Unable to allocate memory for the Rx descriptor "
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1710
		      "ring\n");
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1711
setup_rx_desc_die:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1712
		vfree(rxdr->buffer_info);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1713
		return -ENOMEM;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1714
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1715
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1716
	/* Fix for errata 23, can't cross 64kB boundary */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1717
	if (!e1000_check_64k_bound(adapter, rxdr->desc, rxdr->size)) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1718
		void *olddesc = rxdr->desc;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1719
		dma_addr_t olddma = rxdr->dma;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1720
		e_err(rx_err, "rxdr align check failed: %u bytes at %p\n",
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1721
		      rxdr->size, rxdr->desc);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1722
		/* Try again, without freeing the previous */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1723
		rxdr->desc = dma_alloc_coherent(&pdev->dev, rxdr->size,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1724
						&rxdr->dma, GFP_KERNEL);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1725
		/* Failed allocation, critical failure */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1726
		if (!rxdr->desc) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1727
			dma_free_coherent(&pdev->dev, rxdr->size, olddesc,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1728
					  olddma);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1729
			e_err(probe, "Unable to allocate memory for the Rx "
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1730
			      "descriptor ring\n");
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1731
			goto setup_rx_desc_die;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1732
		}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1733
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1734
		if (!e1000_check_64k_bound(adapter, rxdr->desc, rxdr->size)) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1735
			/* give up */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1736
			dma_free_coherent(&pdev->dev, rxdr->size, rxdr->desc,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1737
					  rxdr->dma);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1738
			dma_free_coherent(&pdev->dev, rxdr->size, olddesc,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1739
					  olddma);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1740
			e_err(probe, "Unable to allocate aligned memory for "
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1741
			      "the Rx descriptor ring\n");
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1742
			goto setup_rx_desc_die;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1743
		} else {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1744
			/* Free old allocation, new allocation was successful */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1745
			dma_free_coherent(&pdev->dev, rxdr->size, olddesc,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1746
					  olddma);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1747
		}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1748
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1749
	memset(rxdr->desc, 0, rxdr->size);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1750
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1751
	rxdr->next_to_clean = 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1752
	rxdr->next_to_use = 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1753
	rxdr->rx_skb_top = NULL;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1754
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1755
	return 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1756
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1757
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1758
/**
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1759
 * e1000_setup_all_rx_resources - wrapper to allocate Rx resources
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1760
 * 				  (Descriptors) for all queues
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1761
 * @adapter: board private structure
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1762
 *
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1763
 * Return 0 on success, negative on failure
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1764
 **/
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1765
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1766
int e1000_setup_all_rx_resources(struct e1000_adapter *adapter)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1767
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1768
	int i, err = 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1769
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1770
	for (i = 0; i < adapter->num_rx_queues; i++) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1771
		err = e1000_setup_rx_resources(adapter, &adapter->rx_ring[i]);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1772
		if (err) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1773
			e_err(probe, "Allocation for Rx Queue %u failed\n", i);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1774
			for (i-- ; i >= 0; i--)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1775
				e1000_free_rx_resources(adapter,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1776
							&adapter->rx_ring[i]);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1777
			break;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1778
		}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1779
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1780
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1781
	return err;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1782
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1783
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1784
/**
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1785
 * e1000_setup_rctl - configure the receive control registers
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1786
 * @adapter: Board private structure
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1787
 **/
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1788
static void e1000_setup_rctl(struct e1000_adapter *adapter)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1789
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1790
	struct e1000_hw *hw = &adapter->hw;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1791
	u32 rctl;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1792
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1793
	rctl = er32(RCTL);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1794
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1795
	rctl &= ~(3 << E1000_RCTL_MO_SHIFT);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1796
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1797
	rctl |= E1000_RCTL_EN | E1000_RCTL_BAM |
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1798
		E1000_RCTL_LBM_NO | E1000_RCTL_RDMTS_HALF |
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1799
		(hw->mc_filter_type << E1000_RCTL_MO_SHIFT);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1800
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1801
	if (hw->tbi_compatibility_on == 1)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1802
		rctl |= E1000_RCTL_SBP;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1803
	else
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1804
		rctl &= ~E1000_RCTL_SBP;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1805
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1806
	if (adapter->netdev->mtu <= ETH_DATA_LEN)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1807
		rctl &= ~E1000_RCTL_LPE;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1808
	else
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1809
		rctl |= E1000_RCTL_LPE;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1810
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1811
	/* Setup buffer sizes */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1812
	rctl &= ~E1000_RCTL_SZ_4096;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1813
	rctl |= E1000_RCTL_BSEX;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1814
	switch (adapter->rx_buffer_len) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1815
		case E1000_RXBUFFER_2048:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1816
		default:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1817
			rctl |= E1000_RCTL_SZ_2048;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1818
			rctl &= ~E1000_RCTL_BSEX;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1819
			break;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1820
		case E1000_RXBUFFER_4096:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1821
			rctl |= E1000_RCTL_SZ_4096;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1822
			break;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1823
		case E1000_RXBUFFER_8192:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1824
			rctl |= E1000_RCTL_SZ_8192;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1825
			break;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1826
		case E1000_RXBUFFER_16384:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1827
			rctl |= E1000_RCTL_SZ_16384;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1828
			break;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1829
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1830
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1831
	ew32(RCTL, rctl);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1832
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1833
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1834
/**
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1835
 * e1000_configure_rx - Configure 8254x Receive Unit after Reset
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1836
 * @adapter: board private structure
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1837
 *
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1838
 * Configure the Rx unit of the MAC after a reset.
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1839
 **/
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1840
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1841
static void e1000_configure_rx(struct e1000_adapter *adapter)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1842
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1843
	u64 rdba;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1844
	struct e1000_hw *hw = &adapter->hw;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1845
	u32 rdlen, rctl, rxcsum;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1846
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1847
	if (adapter->netdev->mtu > ETH_DATA_LEN) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1848
		rdlen = adapter->rx_ring[0].count *
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1849
		        sizeof(struct e1000_rx_desc);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1850
		adapter->clean_rx = e1000_clean_jumbo_rx_irq;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1851
		adapter->alloc_rx_buf = e1000_alloc_jumbo_rx_buffers;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1852
	} else {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1853
		rdlen = adapter->rx_ring[0].count *
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1854
		        sizeof(struct e1000_rx_desc);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1855
		adapter->clean_rx = e1000_clean_rx_irq;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1856
		adapter->alloc_rx_buf = e1000_alloc_rx_buffers;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1857
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1858
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1859
	/* disable receives while setting up the descriptors */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1860
	rctl = er32(RCTL);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1861
	ew32(RCTL, rctl & ~E1000_RCTL_EN);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1862
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1863
	/* set the Receive Delay Timer Register */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1864
	ew32(RDTR, adapter->rx_int_delay);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1865
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1866
	if (hw->mac_type >= e1000_82540) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1867
		ew32(RADV, adapter->rx_abs_int_delay);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1868
		if (adapter->itr_setting != 0)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1869
			ew32(ITR, 1000000000 / (adapter->itr * 256));
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1870
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1871
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1872
	/* Setup the HW Rx Head and Tail Descriptor Pointers and
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1873
	 * the Base and Length of the Rx Descriptor Ring */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1874
	switch (adapter->num_rx_queues) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1875
	case 1:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1876
	default:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1877
		rdba = adapter->rx_ring[0].dma;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1878
		ew32(RDLEN, rdlen);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1879
		ew32(RDBAH, (rdba >> 32));
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1880
		ew32(RDBAL, (rdba & 0x00000000ffffffffULL));
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1881
		ew32(RDT, 0);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1882
		ew32(RDH, 0);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1883
		adapter->rx_ring[0].rdh = ((hw->mac_type >= e1000_82543) ? E1000_RDH : E1000_82542_RDH);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1884
		adapter->rx_ring[0].rdt = ((hw->mac_type >= e1000_82543) ? E1000_RDT : E1000_82542_RDT);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1885
		break;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1886
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1887
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1888
	/* Enable 82543 Receive Checksum Offload for TCP and UDP */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1889
	if (hw->mac_type >= e1000_82543) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1890
		rxcsum = er32(RXCSUM);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1891
		if (adapter->rx_csum)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1892
			rxcsum |= E1000_RXCSUM_TUOFL;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1893
		else
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1894
			/* don't need to clear IPPCSE as it defaults to 0 */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1895
			rxcsum &= ~E1000_RXCSUM_TUOFL;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1896
		ew32(RXCSUM, rxcsum);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1897
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1898
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1899
	/* Enable Receives */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1900
	ew32(RCTL, rctl);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1901
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1902
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1903
/**
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1904
 * e1000_free_tx_resources - Free Tx Resources per Queue
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1905
 * @adapter: board private structure
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1906
 * @tx_ring: Tx descriptor ring for a specific queue
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1907
 *
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1908
 * Free all transmit software resources
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1909
 **/
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1910
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1911
static void e1000_free_tx_resources(struct e1000_adapter *adapter,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1912
				    struct e1000_tx_ring *tx_ring)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1913
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1914
	struct pci_dev *pdev = adapter->pdev;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1915
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1916
	e1000_clean_tx_ring(adapter, tx_ring);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1917
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1918
	vfree(tx_ring->buffer_info);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1919
	tx_ring->buffer_info = NULL;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1920
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1921
	dma_free_coherent(&pdev->dev, tx_ring->size, tx_ring->desc,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1922
			  tx_ring->dma);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1923
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1924
	tx_ring->desc = NULL;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1925
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1926
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1927
/**
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1928
 * e1000_free_all_tx_resources - Free Tx Resources for All Queues
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1929
 * @adapter: board private structure
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1930
 *
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1931
 * Free all transmit software resources
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1932
 **/
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1933
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1934
void e1000_free_all_tx_resources(struct e1000_adapter *adapter)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1935
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1936
	int i;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1937
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1938
	for (i = 0; i < adapter->num_tx_queues; i++)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1939
		e1000_free_tx_resources(adapter, &adapter->tx_ring[i]);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1940
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1941
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1942
static void e1000_unmap_and_free_tx_resource(struct e1000_adapter *adapter,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1943
					     struct e1000_buffer *buffer_info)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1944
{
2284
08edb009bee8 Minor: Indentation and braces.
Florian Pose <fp@igh-essen.com>
parents: 2238
diff changeset
  1945
	if (adapter->ecdev) {
2173
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1946
		return;
2284
08edb009bee8 Minor: Indentation and braces.
Florian Pose <fp@igh-essen.com>
parents: 2238
diff changeset
  1947
	}
2173
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1948
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1949
	if (buffer_info->dma) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1950
		if (buffer_info->mapped_as_page)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1951
			dma_unmap_page(&adapter->pdev->dev, buffer_info->dma,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1952
				       buffer_info->length, DMA_TO_DEVICE);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1953
		else
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1954
			dma_unmap_single(&adapter->pdev->dev, buffer_info->dma,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1955
					 buffer_info->length,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1956
					 DMA_TO_DEVICE);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1957
		buffer_info->dma = 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1958
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1959
	if (buffer_info->skb) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1960
		dev_kfree_skb_any(buffer_info->skb);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1961
		buffer_info->skb = NULL;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1962
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1963
	buffer_info->time_stamp = 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1964
	/* buffer_info must be completely set up in the transmit path */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1965
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1966
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1967
/**
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1968
 * e1000_clean_tx_ring - Free Tx Buffers
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1969
 * @adapter: board private structure
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1970
 * @tx_ring: ring to be cleaned
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1971
 **/
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1972
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1973
static void e1000_clean_tx_ring(struct e1000_adapter *adapter,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1974
				struct e1000_tx_ring *tx_ring)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1975
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1976
	struct e1000_hw *hw = &adapter->hw;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1977
	struct e1000_buffer *buffer_info;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1978
	unsigned long size;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1979
	unsigned int i;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1980
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1981
	/* Free all the Tx ring sk_buffs */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1982
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1983
	for (i = 0; i < tx_ring->count; i++) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1984
		buffer_info = &tx_ring->buffer_info[i];
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1985
		e1000_unmap_and_free_tx_resource(adapter, buffer_info);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1986
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1987
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1988
	size = sizeof(struct e1000_buffer) * tx_ring->count;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1989
	memset(tx_ring->buffer_info, 0, size);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1990
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1991
	/* Zero out the descriptor ring */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1992
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1993
	memset(tx_ring->desc, 0, tx_ring->size);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1994
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1995
	tx_ring->next_to_use = 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1996
	tx_ring->next_to_clean = 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1997
	tx_ring->last_tx_tso = 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1998
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1999
	writel(0, hw->hw_addr + tx_ring->tdh);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2000
	writel(0, hw->hw_addr + tx_ring->tdt);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2001
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2002
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2003
/**
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2004
 * e1000_clean_all_tx_rings - Free Tx Buffers for all queues
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2005
 * @adapter: board private structure
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2006
 **/
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2007
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2008
static void e1000_clean_all_tx_rings(struct e1000_adapter *adapter)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2009
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2010
	int i;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2011
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2012
	for (i = 0; i < adapter->num_tx_queues; i++)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2013
		e1000_clean_tx_ring(adapter, &adapter->tx_ring[i]);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2014
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2015
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2016
/**
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2017
 * e1000_free_rx_resources - Free Rx Resources
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2018
 * @adapter: board private structure
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2019
 * @rx_ring: ring to clean the resources from
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2020
 *
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2021
 * Free all receive software resources
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2022
 **/
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2023
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2024
static void e1000_free_rx_resources(struct e1000_adapter *adapter,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2025
				    struct e1000_rx_ring *rx_ring)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2026
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2027
	struct pci_dev *pdev = adapter->pdev;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2028
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2029
	e1000_clean_rx_ring(adapter, rx_ring);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2030
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2031
	vfree(rx_ring->buffer_info);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2032
	rx_ring->buffer_info = NULL;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2033
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2034
	dma_free_coherent(&pdev->dev, rx_ring->size, rx_ring->desc,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2035
			  rx_ring->dma);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2036
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2037
	rx_ring->desc = NULL;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2038
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2039
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2040
/**
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2041
 * e1000_free_all_rx_resources - Free Rx Resources for All Queues
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2042
 * @adapter: board private structure
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2043
 *
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2044
 * Free all receive software resources
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2045
 **/
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2046
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2047
void e1000_free_all_rx_resources(struct e1000_adapter *adapter)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2048
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2049
	int i;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2050
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2051
	for (i = 0; i < adapter->num_rx_queues; i++)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2052
		e1000_free_rx_resources(adapter, &adapter->rx_ring[i]);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2053
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2054
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2055
/**
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2056
 * e1000_clean_rx_ring - Free Rx Buffers per Queue
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2057
 * @adapter: board private structure
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2058
 * @rx_ring: ring to free buffers from
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2059
 **/
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2060
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2061
static void e1000_clean_rx_ring(struct e1000_adapter *adapter,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2062
				struct e1000_rx_ring *rx_ring)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2063
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2064
	struct e1000_hw *hw = &adapter->hw;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2065
	struct e1000_buffer *buffer_info;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2066
	struct pci_dev *pdev = adapter->pdev;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2067
	unsigned long size;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2068
	unsigned int i;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2069
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2070
	/* Free all the Rx ring sk_buffs */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2071
	for (i = 0; i < rx_ring->count; i++) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2072
		buffer_info = &rx_ring->buffer_info[i];
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2073
		if (buffer_info->dma &&
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2074
		    adapter->clean_rx == e1000_clean_rx_irq) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2075
			dma_unmap_single(&pdev->dev, buffer_info->dma,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2076
			                 buffer_info->length,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2077
					 DMA_FROM_DEVICE);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2078
		} else if (buffer_info->dma &&
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2079
		           adapter->clean_rx == e1000_clean_jumbo_rx_irq) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2080
			dma_unmap_page(&pdev->dev, buffer_info->dma,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2081
				       buffer_info->length,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2082
				       DMA_FROM_DEVICE);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2083
		}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2084
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2085
		buffer_info->dma = 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2086
		if (buffer_info->page) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2087
			put_page(buffer_info->page);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2088
			buffer_info->page = NULL;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2089
		}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2090
		if (buffer_info->skb) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2091
			dev_kfree_skb(buffer_info->skb);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2092
			buffer_info->skb = NULL;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2093
		}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2094
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2095
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2096
	/* there also may be some cached data from a chained receive */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2097
	if (rx_ring->rx_skb_top) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2098
		dev_kfree_skb(rx_ring->rx_skb_top);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2099
		rx_ring->rx_skb_top = NULL;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2100
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2101
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2102
	size = sizeof(struct e1000_buffer) * rx_ring->count;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2103
	memset(rx_ring->buffer_info, 0, size);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2104
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2105
	/* Zero out the descriptor ring */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2106
	memset(rx_ring->desc, 0, rx_ring->size);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2107
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2108
	rx_ring->next_to_clean = 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2109
	rx_ring->next_to_use = 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2110
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2111
	writel(0, hw->hw_addr + rx_ring->rdh);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2112
	writel(0, hw->hw_addr + rx_ring->rdt);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2113
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2114
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2115
/**
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2116
 * e1000_clean_all_rx_rings - Free Rx Buffers for all queues
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2117
 * @adapter: board private structure
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2118
 **/
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2119
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2120
static void e1000_clean_all_rx_rings(struct e1000_adapter *adapter)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2121
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2122
	int i;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2123
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2124
	for (i = 0; i < adapter->num_rx_queues; i++)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2125
		e1000_clean_rx_ring(adapter, &adapter->rx_ring[i]);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2126
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2127
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2128
/* The 82542 2.0 (revision 2) needs to have the receive unit in reset
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2129
 * and memory write and invalidate disabled for certain operations
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2130
 */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2131
static void e1000_enter_82542_rst(struct e1000_adapter *adapter)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2132
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2133
	struct e1000_hw *hw = &adapter->hw;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2134
	struct net_device *netdev = adapter->netdev;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2135
	u32 rctl;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2136
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2137
	e1000_pci_clear_mwi(hw);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2138
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2139
	rctl = er32(RCTL);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2140
	rctl |= E1000_RCTL_RST;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2141
	ew32(RCTL, rctl);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2142
	E1000_WRITE_FLUSH();
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2143
	mdelay(5);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2144
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2145
	if (!adapter->ecdev && netif_running(netdev))
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2146
		e1000_clean_all_rx_rings(adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2147
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2148
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2149
static void e1000_leave_82542_rst(struct e1000_adapter *adapter)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2150
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2151
	struct e1000_hw *hw = &adapter->hw;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2152
	struct net_device *netdev = adapter->netdev;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2153
	u32 rctl;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2154
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2155
	rctl = er32(RCTL);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2156
	rctl &= ~E1000_RCTL_RST;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2157
	ew32(RCTL, rctl);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2158
	E1000_WRITE_FLUSH();
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2159
	mdelay(5);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2160
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2161
	if (hw->pci_cmd_word & PCI_COMMAND_INVALIDATE)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2162
		e1000_pci_set_mwi(hw);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2163
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2164
	if (!adapter->netdev && netif_running(netdev)) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2165
		/* No need to loop, because 82542 supports only 1 queue */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2166
		struct e1000_rx_ring *ring = &adapter->rx_ring[0];
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2167
		e1000_configure_rx(adapter);
2589
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2284
diff changeset
  2168
		if (adapter->ecdev) {
2173
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2169
			/* fill rx ring completely! */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2170
			adapter->alloc_rx_buf(adapter, ring, ring->count);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2171
		} else {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2172
            /* this one leaves the last ring element unallocated! */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2173
			adapter->alloc_rx_buf(adapter, ring, E1000_DESC_UNUSED(ring));
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2174
		}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2175
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2176
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2177
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2178
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2179
/**
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2180
 * e1000_set_mac - Change the Ethernet Address of the NIC
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2181
 * @netdev: network interface device structure
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2182
 * @p: pointer to an address structure
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2183
 *
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2184
 * Returns 0 on success, negative on failure
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2185
 **/
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2186
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2187
static int e1000_set_mac(struct net_device *netdev, void *p)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2188
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2189
	struct e1000_adapter *adapter = netdev_priv(netdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2190
	struct e1000_hw *hw = &adapter->hw;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2191
	struct sockaddr *addr = p;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2192
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2193
	if (!is_valid_ether_addr(addr->sa_data))
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2194
		return -EADDRNOTAVAIL;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2195
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2196
	/* 82542 2.0 needs to be in reset to write receive address registers */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2197
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2198
	if (hw->mac_type == e1000_82542_rev2_0)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2199
		e1000_enter_82542_rst(adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2200
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2201
	memcpy(netdev->dev_addr, addr->sa_data, netdev->addr_len);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2202
	memcpy(hw->mac_addr, addr->sa_data, netdev->addr_len);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2203
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2204
	e1000_rar_set(hw, hw->mac_addr, 0);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2205
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2206
	if (hw->mac_type == e1000_82542_rev2_0)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2207
		e1000_leave_82542_rst(adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2208
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2209
	return 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2210
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2211
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2212
/**
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2213
 * e1000_set_rx_mode - Secondary Unicast, Multicast and Promiscuous mode set
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2214
 * @netdev: network interface device structure
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2215
 *
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2216
 * The set_rx_mode entry point is called whenever the unicast or multicast
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2217
 * address lists or the network interface flags are updated. This routine is
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2218
 * responsible for configuring the hardware for proper unicast, multicast,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2219
 * promiscuous mode, and all-multi behavior.
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2220
 **/
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2221
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2222
static void e1000_set_rx_mode(struct net_device *netdev)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2223
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2224
	struct e1000_adapter *adapter = netdev_priv(netdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2225
	struct e1000_hw *hw = &adapter->hw;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2226
	struct netdev_hw_addr *ha;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2227
	bool use_uc = false;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2228
	u32 rctl;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2229
	u32 hash_value;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2230
	int i, rar_entries = E1000_RAR_ENTRIES;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2231
	int mta_reg_count = E1000_NUM_MTA_REGISTERS;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2232
	u32 *mcarray = kcalloc(mta_reg_count, sizeof(u32), GFP_ATOMIC);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2233
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2234
	if (!mcarray) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2235
		e_err(probe, "memory allocation failed\n");
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2236
		return;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2237
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2238
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2239
	/* Check for Promiscuous and All Multicast modes */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2240
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2241
	rctl = er32(RCTL);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2242
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2243
	if (netdev->flags & IFF_PROMISC) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2244
		rctl |= (E1000_RCTL_UPE | E1000_RCTL_MPE);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2245
		rctl &= ~E1000_RCTL_VFE;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2246
	} else {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2247
		if (netdev->flags & IFF_ALLMULTI)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2248
			rctl |= E1000_RCTL_MPE;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2249
		else
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2250
			rctl &= ~E1000_RCTL_MPE;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2251
		/* Enable VLAN filter if there is a VLAN */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2252
		if (adapter->vlgrp)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2253
			rctl |= E1000_RCTL_VFE;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2254
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2255
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2256
	if (netdev_uc_count(netdev) > rar_entries - 1) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2257
		rctl |= E1000_RCTL_UPE;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2258
	} else if (!(netdev->flags & IFF_PROMISC)) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2259
		rctl &= ~E1000_RCTL_UPE;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2260
		use_uc = true;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2261
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2262
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2263
	ew32(RCTL, rctl);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2264
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2265
	/* 82542 2.0 needs to be in reset to write receive address registers */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2266
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2267
	if (hw->mac_type == e1000_82542_rev2_0)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2268
		e1000_enter_82542_rst(adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2269
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2270
	/* load the first 14 addresses into the exact filters 1-14. Unicast
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2271
	 * addresses take precedence to avoid disabling unicast filtering
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2272
	 * when possible.
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2273
	 *
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2274
	 * RAR 0 is used for the station MAC adddress
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2275
	 * if there are not 14 addresses, go ahead and clear the filters
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2276
	 */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2277
	i = 1;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2278
	if (use_uc)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2279
		netdev_for_each_uc_addr(ha, netdev) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2280
			if (i == rar_entries)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2281
				break;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2282
			e1000_rar_set(hw, ha->addr, i++);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2283
		}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2284
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2285
	netdev_for_each_mc_addr(ha, netdev) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2286
		if (i == rar_entries) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2287
			/* load any remaining addresses into the hash table */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2288
			u32 hash_reg, hash_bit, mta;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2289
			hash_value = e1000_hash_mc_addr(hw, ha->addr);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2290
			hash_reg = (hash_value >> 5) & 0x7F;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2291
			hash_bit = hash_value & 0x1F;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2292
			mta = (1 << hash_bit);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2293
			mcarray[hash_reg] |= mta;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2294
		} else {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2295
			e1000_rar_set(hw, ha->addr, i++);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2296
		}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2297
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2298
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2299
	for (; i < rar_entries; i++) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2300
		E1000_WRITE_REG_ARRAY(hw, RA, i << 1, 0);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2301
		E1000_WRITE_FLUSH();
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2302
		E1000_WRITE_REG_ARRAY(hw, RA, (i << 1) + 1, 0);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2303
		E1000_WRITE_FLUSH();
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2304
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2305
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2306
	/* write the hash table completely, write from bottom to avoid
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2307
	 * both stupid write combining chipsets, and flushing each write */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2308
	for (i = mta_reg_count - 1; i >= 0 ; i--) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2309
		/*
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2310
		 * If we are on an 82544 has an errata where writing odd
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2311
		 * offsets overwrites the previous even offset, but writing
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2312
		 * backwards over the range solves the issue by always
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2313
		 * writing the odd offset first
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2314
		 */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2315
		E1000_WRITE_REG_ARRAY(hw, MTA, i, mcarray[i]);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2316
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2317
	E1000_WRITE_FLUSH();
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2318
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2319
	if (hw->mac_type == e1000_82542_rev2_0)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2320
		e1000_leave_82542_rst(adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2321
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2322
	kfree(mcarray);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2323
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2324
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2325
/* Need to wait a few seconds after link up to get diagnostic information from
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2326
 * the phy */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2327
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2328
static void e1000_update_phy_info(unsigned long data)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2329
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2330
	struct e1000_adapter *adapter = (struct e1000_adapter *)data;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2331
	schedule_work(&adapter->phy_info_task);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2332
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2333
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2334
static void e1000_update_phy_info_task(struct work_struct *work)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2335
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2336
	struct e1000_adapter *adapter = container_of(work,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2337
	                                             struct e1000_adapter,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2338
	                                             phy_info_task);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2339
	struct e1000_hw *hw = &adapter->hw;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2340
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2341
	rtnl_lock();
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2342
	e1000_phy_get_info(hw, &adapter->phy_info);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2343
	rtnl_unlock();
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2344
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2345
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2346
/**
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2347
 * e1000_82547_tx_fifo_stall - Timer Call-back
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2348
 * @data: pointer to adapter cast into an unsigned long
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2349
 **/
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2350
static void e1000_82547_tx_fifo_stall(unsigned long data)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2351
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2352
	struct e1000_adapter *adapter = (struct e1000_adapter *)data;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2353
	schedule_work(&adapter->fifo_stall_task);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2354
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2355
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2356
/**
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2357
 * e1000_82547_tx_fifo_stall_task - task to complete work
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2358
 * @work: work struct contained inside adapter struct
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2359
 **/
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2360
static void e1000_82547_tx_fifo_stall_task(struct work_struct *work)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2361
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2362
	struct e1000_adapter *adapter = container_of(work,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2363
	                                             struct e1000_adapter,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2364
	                                             fifo_stall_task);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2365
	struct e1000_hw *hw = &adapter->hw;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2366
	struct net_device *netdev = adapter->netdev;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2367
	u32 tctl;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2368
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2369
	rtnl_lock();
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2370
	if (atomic_read(&adapter->tx_fifo_stall)) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2371
		if ((er32(TDT) == er32(TDH)) &&
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2372
		   (er32(TDFT) == er32(TDFH)) &&
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2373
		   (er32(TDFTS) == er32(TDFHS))) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2374
			tctl = er32(TCTL);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2375
			ew32(TCTL, tctl & ~E1000_TCTL_EN);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2376
			ew32(TDFT, adapter->tx_head_addr);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2377
			ew32(TDFH, adapter->tx_head_addr);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2378
			ew32(TDFTS, adapter->tx_head_addr);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2379
			ew32(TDFHS, adapter->tx_head_addr);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2380
			ew32(TCTL, tctl);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2381
			E1000_WRITE_FLUSH();
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2382
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2383
			adapter->tx_fifo_head = 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2384
			atomic_set(&adapter->tx_fifo_stall, 0);
2284
08edb009bee8 Minor: Indentation and braces.
Florian Pose <fp@igh-essen.com>
parents: 2238
diff changeset
  2385
			if (!adapter->ecdev) {
08edb009bee8 Minor: Indentation and braces.
Florian Pose <fp@igh-essen.com>
parents: 2238
diff changeset
  2386
				netif_wake_queue(netdev);
08edb009bee8 Minor: Indentation and braces.
Florian Pose <fp@igh-essen.com>
parents: 2238
diff changeset
  2387
			}
2173
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2388
		} else if (!test_bit(__E1000_DOWN, &adapter->flags)) {
2284
08edb009bee8 Minor: Indentation and braces.
Florian Pose <fp@igh-essen.com>
parents: 2238
diff changeset
  2389
			if (!adapter->ecdev) {
2173
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2390
				mod_timer(&adapter->tx_fifo_stall_timer, jiffies + 1);
2284
08edb009bee8 Minor: Indentation and braces.
Florian Pose <fp@igh-essen.com>
parents: 2238
diff changeset
  2391
			}
2173
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2392
		}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2393
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2394
	rtnl_unlock();
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2395
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2396
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2397
bool e1000_has_link(struct e1000_adapter *adapter)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2398
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2399
	struct e1000_hw *hw = &adapter->hw;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2400
	bool link_active = false;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2401
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2402
	/* get_link_status is set on LSC (link status) interrupt or
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2403
	 * rx sequence error interrupt.  get_link_status will stay
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2404
	 * false until the e1000_check_for_link establishes link
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2405
	 * for copper adapters ONLY
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2406
	 */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2407
	switch (hw->media_type) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2408
	case e1000_media_type_copper:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2409
		if (hw->get_link_status) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2410
			e1000_check_for_link(hw);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2411
			link_active = !hw->get_link_status;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2412
		} else {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2413
			link_active = true;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2414
		}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2415
		break;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2416
	case e1000_media_type_fiber:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2417
		e1000_check_for_link(hw);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2418
		link_active = !!(er32(STATUS) & E1000_STATUS_LU);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2419
		break;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2420
	case e1000_media_type_internal_serdes:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2421
		e1000_check_for_link(hw);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2422
		link_active = hw->serdes_has_link;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2423
		break;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2424
	default:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2425
		break;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2426
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2427
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2428
	return link_active;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2429
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2430
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2431
/**
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2432
 * e1000_watchdog - Timer Call-back
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2433
 * @data: pointer to adapter cast into an unsigned long
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2434
 **/
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2435
static void e1000_watchdog(unsigned long data)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2436
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2437
	struct e1000_adapter *adapter = (struct e1000_adapter *)data;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2438
	struct e1000_hw *hw = &adapter->hw;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2439
	struct net_device *netdev = adapter->netdev;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2440
	struct e1000_tx_ring *txdr = adapter->tx_ring;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2441
	u32 link, tctl;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2442
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2443
	link = e1000_has_link(adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2444
	if (!adapter->ecdev && (netif_carrier_ok(netdev)) && link)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2445
		goto link_up;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2446
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2447
	if (link) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2448
		if ((adapter->ecdev && !ecdev_get_link(adapter->ecdev))
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2449
				|| (!adapter->ecdev && !netif_carrier_ok(netdev))) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2450
			u32 ctrl;
2238
737bd9eb0e21 Avoided unused variable warnings.
Florian Pose <fp@igh-essen.com>
parents: 2213
diff changeset
  2451
			bool txb2b __attribute__ ((unused)) = true;
2173
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2452
			/* update snapshot of PHY registers on LSC */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2453
			e1000_get_speed_and_duplex(hw,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2454
			                           &adapter->link_speed,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2455
			                           &adapter->link_duplex);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2456
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2457
			ctrl = er32(CTRL);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2458
			pr_info("%s NIC Link is Up %d Mbps %s, "
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2459
				"Flow Control: %s\n",
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2460
				netdev->name,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2461
				adapter->link_speed,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2462
				adapter->link_duplex == FULL_DUPLEX ?
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2463
				"Full Duplex" : "Half Duplex",
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2464
				((ctrl & E1000_CTRL_TFCE) && (ctrl &
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2465
				E1000_CTRL_RFCE)) ? "RX/TX" : ((ctrl &
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2466
				E1000_CTRL_RFCE) ? "RX" : ((ctrl &
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2467
				E1000_CTRL_TFCE) ? "TX" : "None")));
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2468
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2469
			/* adjust timeout factor according to speed/duplex */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2470
			adapter->tx_timeout_factor = 1;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2471
			switch (adapter->link_speed) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2472
			case SPEED_10:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2473
				txb2b = false;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2474
				adapter->tx_timeout_factor = 16;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2475
				break;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2476
			case SPEED_100:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2477
				txb2b = false;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2478
				/* maybe add some timeout factor ? */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2479
				break;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2480
			}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2481
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2482
			/* enable transmits in the hardware */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2483
			tctl = er32(TCTL);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2484
			tctl |= E1000_TCTL_EN;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2485
			ew32(TCTL, tctl);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2486
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2487
			if (adapter->ecdev) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2488
				ecdev_set_link(adapter->ecdev, 1);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2489
			} else {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2490
				netif_carrier_on(netdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2491
				if (!test_bit(__E1000_DOWN, &adapter->flags))
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2492
					mod_timer(&adapter->phy_info_timer,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2493
							round_jiffies(jiffies + 2 * HZ));
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2494
			}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2495
			adapter->smartspeed = 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2496
		}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2497
	} else {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2498
		if ((adapter->ecdev && ecdev_get_link(adapter->ecdev))
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2499
				|| (!adapter->ecdev && netif_carrier_ok(netdev))) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2500
			adapter->link_speed = 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2501
			adapter->link_duplex = 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2502
			pr_info("%s NIC Link is Down\n",
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2503
				netdev->name);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2504
			if (adapter->ecdev) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2505
				ecdev_set_link(adapter->ecdev, 0);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2506
			} else {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2507
				netif_carrier_off(netdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2508
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2509
				if (!test_bit(__E1000_DOWN, &adapter->flags))
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2510
					mod_timer(&adapter->phy_info_timer,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2511
							round_jiffies(jiffies + 2 * HZ));
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2512
			}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2513
		}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2514
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2515
		e1000_smartspeed(adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2516
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2517
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2518
link_up:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2519
	e1000_update_stats(adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2520
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2521
	hw->tx_packet_delta = adapter->stats.tpt - adapter->tpt_old;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2522
	adapter->tpt_old = adapter->stats.tpt;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2523
	hw->collision_delta = adapter->stats.colc - adapter->colc_old;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2524
	adapter->colc_old = adapter->stats.colc;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2525
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2526
	adapter->gorcl = adapter->stats.gorcl - adapter->gorcl_old;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2527
	adapter->gorcl_old = adapter->stats.gorcl;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2528
	adapter->gotcl = adapter->stats.gotcl - adapter->gotcl_old;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2529
	adapter->gotcl_old = adapter->stats.gotcl;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2530
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2531
	e1000_update_adaptive(hw);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2532
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2533
	if (!adapter->ecdev && !netif_carrier_ok(netdev)) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2534
		if (E1000_DESC_UNUSED(txdr) + 1 < txdr->count) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2535
			/* We've lost link, so the controller stops DMA,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2536
			 * but we've got queued Tx work that's never going
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2537
			 * to get done, so reset controller to flush Tx.
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2538
			 * (Do the reset outside of interrupt context). */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2539
			adapter->tx_timeout_count++;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2540
			schedule_work(&adapter->reset_task);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2541
			/* return immediately since reset is imminent */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2542
			return;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2543
		}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2544
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2545
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2546
	/* Simple mode for Interrupt Throttle Rate (ITR) */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2547
	if (hw->mac_type >= e1000_82540 && adapter->itr_setting == 4) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2548
		/*
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2549
		 * Symmetric Tx/Rx gets a reduced ITR=2000;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2550
		 * Total asymmetrical Tx or Rx gets ITR=8000;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2551
		 * everyone else is between 2000-8000.
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2552
		 */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2553
		u32 goc = (adapter->gotcl + adapter->gorcl) / 10000;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2554
		u32 dif = (adapter->gotcl > adapter->gorcl ?
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2555
			    adapter->gotcl - adapter->gorcl :
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2556
			    adapter->gorcl - adapter->gotcl) / 10000;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2557
		u32 itr = goc > 0 ? (dif * 6000 / goc + 2000) : 8000;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2558
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2559
		ew32(ITR, 1000000000 / (itr * 256));
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2560
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2561
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2562
	/* Cause software interrupt to ensure rx ring is cleaned */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2563
	ew32(ICS, E1000_ICS_RXDMT0);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2564
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2565
	/* Force detection of hung controller every watchdog period */
2284
08edb009bee8 Minor: Indentation and braces.
Florian Pose <fp@igh-essen.com>
parents: 2238
diff changeset
  2566
	if (!adapter->ecdev) {
08edb009bee8 Minor: Indentation and braces.
Florian Pose <fp@igh-essen.com>
parents: 2238
diff changeset
  2567
		adapter->detect_tx_hung = true;
08edb009bee8 Minor: Indentation and braces.
Florian Pose <fp@igh-essen.com>
parents: 2238
diff changeset
  2568
	}
2173
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2569
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2570
	/* Reset the timer */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2571
	if (!adapter->ecdev) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2572
		if (!test_bit(__E1000_DOWN, &adapter->flags))
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2573
			mod_timer(&adapter->watchdog_timer,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2574
			          round_jiffies(jiffies + 2 * HZ));
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2575
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2576
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2577
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2578
enum latency_range {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2579
	lowest_latency = 0,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2580
	low_latency = 1,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2581
	bulk_latency = 2,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2582
	latency_invalid = 255
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2583
};
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2584
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2585
/**
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2586
 * e1000_update_itr - update the dynamic ITR value based on statistics
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2587
 * @adapter: pointer to adapter
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2588
 * @itr_setting: current adapter->itr
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2589
 * @packets: the number of packets during this measurement interval
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2590
 * @bytes: the number of bytes during this measurement interval
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2591
 *
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2592
 *      Stores a new ITR value based on packets and byte
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2593
 *      counts during the last interrupt.  The advantage of per interrupt
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2594
 *      computation is faster updates and more accurate ITR for the current
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2595
 *      traffic pattern.  Constants in this function were computed
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2596
 *      based on theoretical maximum wire speed and thresholds were set based
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2597
 *      on testing data as well as attempting to minimize response time
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2598
 *      while increasing bulk throughput.
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2599
 *      this functionality is controlled by the InterruptThrottleRate module
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2600
 *      parameter (see e1000_param.c)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2601
 **/
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2602
static unsigned int e1000_update_itr(struct e1000_adapter *adapter,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2603
				     u16 itr_setting, int packets, int bytes)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2604
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2605
	unsigned int retval = itr_setting;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2606
	struct e1000_hw *hw = &adapter->hw;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2607
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2608
	if (unlikely(hw->mac_type < e1000_82540))
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2609
		goto update_itr_done;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2610
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2611
	if (packets == 0)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2612
		goto update_itr_done;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2613
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2614
	switch (itr_setting) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2615
	case lowest_latency:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2616
		/* jumbo frames get bulk treatment*/
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2617
		if (bytes/packets > 8000)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2618
			retval = bulk_latency;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2619
		else if ((packets < 5) && (bytes > 512))
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2620
			retval = low_latency;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2621
		break;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2622
	case low_latency:  /* 50 usec aka 20000 ints/s */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2623
		if (bytes > 10000) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2624
			/* jumbo frames need bulk latency setting */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2625
			if (bytes/packets > 8000)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2626
				retval = bulk_latency;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2627
			else if ((packets < 10) || ((bytes/packets) > 1200))
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2628
				retval = bulk_latency;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2629
			else if ((packets > 35))
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2630
				retval = lowest_latency;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2631
		} else if (bytes/packets > 2000)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2632
			retval = bulk_latency;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2633
		else if (packets <= 2 && bytes < 512)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2634
			retval = lowest_latency;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2635
		break;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2636
	case bulk_latency: /* 250 usec aka 4000 ints/s */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2637
		if (bytes > 25000) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2638
			if (packets > 35)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2639
				retval = low_latency;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2640
		} else if (bytes < 6000) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2641
			retval = low_latency;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2642
		}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2643
		break;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2644
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2645
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2646
update_itr_done:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2647
	return retval;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2648
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2649
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2650
static void e1000_set_itr(struct e1000_adapter *adapter)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2651
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2652
	struct e1000_hw *hw = &adapter->hw;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2653
	u16 current_itr;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2654
	u32 new_itr = adapter->itr;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2655
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2656
	if (unlikely(hw->mac_type < e1000_82540))
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2657
		return;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2658
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2659
	/* for non-gigabit speeds, just fix the interrupt rate at 4000 */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2660
	if (unlikely(adapter->link_speed != SPEED_1000)) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2661
		current_itr = 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2662
		new_itr = 4000;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2663
		goto set_itr_now;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2664
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2665
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2666
	adapter->tx_itr = e1000_update_itr(adapter,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2667
	                            adapter->tx_itr,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2668
	                            adapter->total_tx_packets,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2669
	                            adapter->total_tx_bytes);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2670
	/* conservative mode (itr 3) eliminates the lowest_latency setting */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2671
	if (adapter->itr_setting == 3 && adapter->tx_itr == lowest_latency)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2672
		adapter->tx_itr = low_latency;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2673
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2674
	adapter->rx_itr = e1000_update_itr(adapter,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2675
	                            adapter->rx_itr,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2676
	                            adapter->total_rx_packets,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2677
	                            adapter->total_rx_bytes);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2678
	/* conservative mode (itr 3) eliminates the lowest_latency setting */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2679
	if (adapter->itr_setting == 3 && adapter->rx_itr == lowest_latency)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2680
		adapter->rx_itr = low_latency;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2681
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2682
	current_itr = max(adapter->rx_itr, adapter->tx_itr);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2683
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2684
	switch (current_itr) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2685
	/* counts and packets in update_itr are dependent on these numbers */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2686
	case lowest_latency:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2687
		new_itr = 70000;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2688
		break;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2689
	case low_latency:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2690
		new_itr = 20000; /* aka hwitr = ~200 */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2691
		break;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2692
	case bulk_latency:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2693
		new_itr = 4000;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2694
		break;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2695
	default:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2696
		break;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2697
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2698
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2699
set_itr_now:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2700
	if (new_itr != adapter->itr) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2701
		/* this attempts to bias the interrupt rate towards Bulk
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2702
		 * by adding intermediate steps when interrupt rate is
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2703
		 * increasing */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2704
		new_itr = new_itr > adapter->itr ?
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2705
		             min(adapter->itr + (new_itr >> 2), new_itr) :
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2706
		             new_itr;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2707
		adapter->itr = new_itr;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2708
		ew32(ITR, 1000000000 / (new_itr * 256));
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2709
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2710
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2711
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2712
#define E1000_TX_FLAGS_CSUM		0x00000001
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2713
#define E1000_TX_FLAGS_VLAN		0x00000002
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2714
#define E1000_TX_FLAGS_TSO		0x00000004
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2715
#define E1000_TX_FLAGS_IPV4		0x00000008
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2716
#define E1000_TX_FLAGS_VLAN_MASK	0xffff0000
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2717
#define E1000_TX_FLAGS_VLAN_SHIFT	16
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2718
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2719
static int e1000_tso(struct e1000_adapter *adapter,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2720
		     struct e1000_tx_ring *tx_ring, struct sk_buff *skb)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2721
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2722
	struct e1000_context_desc *context_desc;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2723
	struct e1000_buffer *buffer_info;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2724
	unsigned int i;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2725
	u32 cmd_length = 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2726
	u16 ipcse = 0, tucse, mss;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2727
	u8 ipcss, ipcso, tucss, tucso, hdr_len;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2728
	int err;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2729
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2730
	if (skb_is_gso(skb)) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2731
		if (skb_header_cloned(skb)) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2732
			err = pskb_expand_head(skb, 0, 0, GFP_ATOMIC);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2733
			if (err)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2734
				return err;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2735
		}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2736
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2737
		hdr_len = skb_transport_offset(skb) + tcp_hdrlen(skb);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2738
		mss = skb_shinfo(skb)->gso_size;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2739
		if (skb->protocol == htons(ETH_P_IP)) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2740
			struct iphdr *iph = ip_hdr(skb);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2741
			iph->tot_len = 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2742
			iph->check = 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2743
			tcp_hdr(skb)->check = ~csum_tcpudp_magic(iph->saddr,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2744
								 iph->daddr, 0,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2745
								 IPPROTO_TCP,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2746
								 0);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2747
			cmd_length = E1000_TXD_CMD_IP;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2748
			ipcse = skb_transport_offset(skb) - 1;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2749
		} else if (skb->protocol == htons(ETH_P_IPV6)) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2750
			ipv6_hdr(skb)->payload_len = 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2751
			tcp_hdr(skb)->check =
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2752
				~csum_ipv6_magic(&ipv6_hdr(skb)->saddr,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2753
						 &ipv6_hdr(skb)->daddr,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2754
						 0, IPPROTO_TCP, 0);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2755
			ipcse = 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2756
		}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2757
		ipcss = skb_network_offset(skb);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2758
		ipcso = (void *)&(ip_hdr(skb)->check) - (void *)skb->data;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2759
		tucss = skb_transport_offset(skb);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2760
		tucso = (void *)&(tcp_hdr(skb)->check) - (void *)skb->data;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2761
		tucse = 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2762
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2763
		cmd_length |= (E1000_TXD_CMD_DEXT | E1000_TXD_CMD_TSE |
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2764
			       E1000_TXD_CMD_TCP | (skb->len - (hdr_len)));
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2765
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2766
		i = tx_ring->next_to_use;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2767
		context_desc = E1000_CONTEXT_DESC(*tx_ring, i);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2768
		buffer_info = &tx_ring->buffer_info[i];
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2769
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2770
		context_desc->lower_setup.ip_fields.ipcss  = ipcss;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2771
		context_desc->lower_setup.ip_fields.ipcso  = ipcso;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2772
		context_desc->lower_setup.ip_fields.ipcse  = cpu_to_le16(ipcse);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2773
		context_desc->upper_setup.tcp_fields.tucss = tucss;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2774
		context_desc->upper_setup.tcp_fields.tucso = tucso;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2775
		context_desc->upper_setup.tcp_fields.tucse = cpu_to_le16(tucse);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2776
		context_desc->tcp_seg_setup.fields.mss     = cpu_to_le16(mss);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2777
		context_desc->tcp_seg_setup.fields.hdr_len = hdr_len;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2778
		context_desc->cmd_and_length = cpu_to_le32(cmd_length);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2779
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2780
		buffer_info->time_stamp = jiffies;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2781
		buffer_info->next_to_watch = i;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2782
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2783
		if (++i == tx_ring->count) i = 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2784
		tx_ring->next_to_use = i;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2785
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2786
		return true;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2787
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2788
	return false;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2789
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2790
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2791
static bool e1000_tx_csum(struct e1000_adapter *adapter,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2792
			  struct e1000_tx_ring *tx_ring, struct sk_buff *skb)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2793
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2794
	struct e1000_context_desc *context_desc;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2795
	struct e1000_buffer *buffer_info;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2796
	unsigned int i;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2797
	u8 css;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2798
	u32 cmd_len = E1000_TXD_CMD_DEXT;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2799
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2800
	if (skb->ip_summed != CHECKSUM_PARTIAL)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2801
		return false;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2802
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2803
	switch (skb->protocol) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2804
	case cpu_to_be16(ETH_P_IP):
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2805
		if (ip_hdr(skb)->protocol == IPPROTO_TCP)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2806
			cmd_len |= E1000_TXD_CMD_TCP;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2807
		break;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2808
	case cpu_to_be16(ETH_P_IPV6):
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2809
		/* XXX not handling all IPV6 headers */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2810
		if (ipv6_hdr(skb)->nexthdr == IPPROTO_TCP)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2811
			cmd_len |= E1000_TXD_CMD_TCP;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2812
		break;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2813
	default:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2814
		if (unlikely(net_ratelimit()))
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2815
			e_warn(drv, "checksum_partial proto=%x!\n",
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2816
			       skb->protocol);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2817
		break;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2818
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2819
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2820
	css = skb_transport_offset(skb);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2821
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2822
	i = tx_ring->next_to_use;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2823
	buffer_info = &tx_ring->buffer_info[i];
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2824
	context_desc = E1000_CONTEXT_DESC(*tx_ring, i);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2825
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2826
	context_desc->lower_setup.ip_config = 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2827
	context_desc->upper_setup.tcp_fields.tucss = css;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2828
	context_desc->upper_setup.tcp_fields.tucso =
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2829
		css + skb->csum_offset;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2830
	context_desc->upper_setup.tcp_fields.tucse = 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2831
	context_desc->tcp_seg_setup.data = 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2832
	context_desc->cmd_and_length = cpu_to_le32(cmd_len);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2833
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2834
	buffer_info->time_stamp = jiffies;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2835
	buffer_info->next_to_watch = i;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2836
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2837
	if (unlikely(++i == tx_ring->count)) i = 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2838
	tx_ring->next_to_use = i;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2839
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2840
	return true;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2841
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2842
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2843
#define E1000_MAX_TXD_PWR	12
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2844
#define E1000_MAX_DATA_PER_TXD	(1<<E1000_MAX_TXD_PWR)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2845
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2846
static int e1000_tx_map(struct e1000_adapter *adapter,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2847
			struct e1000_tx_ring *tx_ring,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2848
			struct sk_buff *skb, unsigned int first,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2849
			unsigned int max_per_txd, unsigned int nr_frags,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2850
			unsigned int mss)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2851
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2852
	struct e1000_hw *hw = &adapter->hw;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2853
	struct pci_dev *pdev = adapter->pdev;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2854
	struct e1000_buffer *buffer_info;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2855
	unsigned int len = skb_headlen(skb);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2856
	unsigned int offset = 0, size, count = 0, i;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2857
	unsigned int f;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2858
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2859
	i = tx_ring->next_to_use;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2860
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2861
	while (len) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2862
		buffer_info = &tx_ring->buffer_info[i];
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2863
		size = min(len, max_per_txd);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2864
		/* Workaround for Controller erratum --
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2865
		 * descriptor for non-tso packet in a linear SKB that follows a
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2866
		 * tso gets written back prematurely before the data is fully
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2867
		 * DMA'd to the controller */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2868
		if (!skb->data_len && tx_ring->last_tx_tso &&
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2869
		    !skb_is_gso(skb)) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2870
			tx_ring->last_tx_tso = 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2871
			size -= 4;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2872
		}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2873
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2874
		/* Workaround for premature desc write-backs
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2875
		 * in TSO mode.  Append 4-byte sentinel desc */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2876
		if (unlikely(mss && !nr_frags && size == len && size > 8))
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2877
			size -= 4;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2878
		/* work-around for errata 10 and it applies
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2879
		 * to all controllers in PCI-X mode
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2880
		 * The fix is to make sure that the first descriptor of a
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2881
		 * packet is smaller than 2048 - 16 - 16 (or 2016) bytes
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2882
		 */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2883
		if (unlikely((hw->bus_type == e1000_bus_type_pcix) &&
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2884
		                (size > 2015) && count == 0))
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2885
		        size = 2015;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2886
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2887
		/* Workaround for potential 82544 hang in PCI-X.  Avoid
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2888
		 * terminating buffers within evenly-aligned dwords. */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2889
		if (unlikely(adapter->pcix_82544 &&
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2890
		   !((unsigned long)(skb->data + offset + size - 1) & 4) &&
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2891
		   size > 4))
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2892
			size -= 4;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2893
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2894
		buffer_info->length = size;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2895
		/* set time_stamp *before* dma to help avoid a possible race */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2896
		buffer_info->time_stamp = jiffies;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2897
		buffer_info->mapped_as_page = false;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2898
		buffer_info->dma = dma_map_single(&pdev->dev,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2899
						  skb->data + offset,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2900
						  size,	DMA_TO_DEVICE);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2901
		if (dma_mapping_error(&pdev->dev, buffer_info->dma))
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2902
			goto dma_error;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2903
		buffer_info->next_to_watch = i;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2904
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2905
		len -= size;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2906
		offset += size;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2907
		count++;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2908
		if (len) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2909
			i++;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2910
			if (unlikely(i == tx_ring->count))
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2911
				i = 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2912
		}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2913
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2914
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2915
	for (f = 0; f < nr_frags; f++) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2916
		struct skb_frag_struct *frag;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2917
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2918
		frag = &skb_shinfo(skb)->frags[f];
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2919
		len = frag->size;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2920
		offset = frag->page_offset;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2921
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2922
		while (len) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2923
			i++;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2924
			if (unlikely(i == tx_ring->count))
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2925
				i = 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2926
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2927
			buffer_info = &tx_ring->buffer_info[i];
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2928
			size = min(len, max_per_txd);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2929
			/* Workaround for premature desc write-backs
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2930
			 * in TSO mode.  Append 4-byte sentinel desc */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2931
			if (unlikely(mss && f == (nr_frags-1) && size == len && size > 8))
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2932
				size -= 4;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2933
			/* Workaround for potential 82544 hang in PCI-X.
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2934
			 * Avoid terminating buffers within evenly-aligned
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2935
			 * dwords. */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2936
			if (unlikely(adapter->pcix_82544 &&
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2937
			    !((unsigned long)(page_to_phys(frag->page) + offset
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2938
			                      + size - 1) & 4) &&
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2939
			    size > 4))
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2940
				size -= 4;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2941
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2942
			buffer_info->length = size;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2943
			buffer_info->time_stamp = jiffies;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2944
			buffer_info->mapped_as_page = true;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2945
			buffer_info->dma = dma_map_page(&pdev->dev, frag->page,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2946
							offset,	size,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2947
							DMA_TO_DEVICE);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2948
			if (dma_mapping_error(&pdev->dev, buffer_info->dma))
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2949
				goto dma_error;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2950
			buffer_info->next_to_watch = i;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2951
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2952
			len -= size;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2953
			offset += size;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2954
			count++;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2955
		}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2956
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2957
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2958
	tx_ring->buffer_info[i].skb = skb;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2959
	tx_ring->buffer_info[first].next_to_watch = i;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2960
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2961
	return count;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2962
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2963
dma_error:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2964
	dev_err(&pdev->dev, "TX DMA map failed\n");
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2965
	buffer_info->dma = 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2966
	if (count)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2967
		count--;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2968
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2969
	while (count--) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2970
		if (i==0)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2971
			i += tx_ring->count;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2972
		i--;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2973
		buffer_info = &tx_ring->buffer_info[i];
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2974
		e1000_unmap_and_free_tx_resource(adapter, buffer_info);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2975
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2976
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2977
	return 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2978
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2979
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2980
static void e1000_tx_queue(struct e1000_adapter *adapter,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2981
			   struct e1000_tx_ring *tx_ring, int tx_flags,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2982
			   int count)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2983
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2984
	struct e1000_hw *hw = &adapter->hw;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2985
	struct e1000_tx_desc *tx_desc = NULL;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2986
	struct e1000_buffer *buffer_info;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2987
	u32 txd_upper = 0, txd_lower = E1000_TXD_CMD_IFCS;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2988
	unsigned int i;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2989
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2990
	if (likely(tx_flags & E1000_TX_FLAGS_TSO)) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2991
		txd_lower |= E1000_TXD_CMD_DEXT | E1000_TXD_DTYP_D |
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2992
		             E1000_TXD_CMD_TSE;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2993
		txd_upper |= E1000_TXD_POPTS_TXSM << 8;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2994
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2995
		if (likely(tx_flags & E1000_TX_FLAGS_IPV4))
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2996
			txd_upper |= E1000_TXD_POPTS_IXSM << 8;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2997
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2998
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2999
	if (likely(tx_flags & E1000_TX_FLAGS_CSUM)) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3000
		txd_lower |= E1000_TXD_CMD_DEXT | E1000_TXD_DTYP_D;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3001
		txd_upper |= E1000_TXD_POPTS_TXSM << 8;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3002
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3003
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3004
	if (unlikely(tx_flags & E1000_TX_FLAGS_VLAN)) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3005
		txd_lower |= E1000_TXD_CMD_VLE;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3006
		txd_upper |= (tx_flags & E1000_TX_FLAGS_VLAN_MASK);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3007
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3008
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3009
	i = tx_ring->next_to_use;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3010
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3011
	while (count--) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3012
		buffer_info = &tx_ring->buffer_info[i];
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3013
		tx_desc = E1000_TX_DESC(*tx_ring, i);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3014
		tx_desc->buffer_addr = cpu_to_le64(buffer_info->dma);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3015
		tx_desc->lower.data =
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3016
			cpu_to_le32(txd_lower | buffer_info->length);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3017
		tx_desc->upper.data = cpu_to_le32(txd_upper);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3018
		if (unlikely(++i == tx_ring->count)) i = 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3019
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3020
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3021
	tx_desc->lower.data |= cpu_to_le32(adapter->txd_cmd);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3022
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3023
	/* Force memory writes to complete before letting h/w
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3024
	 * know there are new descriptors to fetch.  (Only
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3025
	 * applicable for weak-ordered memory model archs,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3026
	 * such as IA-64). */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3027
	wmb();
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3028
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3029
	tx_ring->next_to_use = i;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3030
	writel(i, hw->hw_addr + tx_ring->tdt);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3031
	/* we need this if more than one processor can write to our tail
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3032
	 * at a time, it syncronizes IO on IA64/Altix systems */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3033
	mmiowb();
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3034
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3035
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3036
/**
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3037
 * 82547 workaround to avoid controller hang in half-duplex environment.
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3038
 * The workaround is to avoid queuing a large packet that would span
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3039
 * the internal Tx FIFO ring boundary by notifying the stack to resend
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3040
 * the packet at a later time.  This gives the Tx FIFO an opportunity to
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3041
 * flush all packets.  When that occurs, we reset the Tx FIFO pointers
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3042
 * to the beginning of the Tx FIFO.
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3043
 **/
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3044
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3045
#define E1000_FIFO_HDR			0x10
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3046
#define E1000_82547_PAD_LEN		0x3E0
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3047
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3048
static int e1000_82547_fifo_workaround(struct e1000_adapter *adapter,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3049
				       struct sk_buff *skb)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3050
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3051
	u32 fifo_space = adapter->tx_fifo_size - adapter->tx_fifo_head;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3052
	u32 skb_fifo_len = skb->len + E1000_FIFO_HDR;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3053
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3054
	skb_fifo_len = ALIGN(skb_fifo_len, E1000_FIFO_HDR);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3055
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3056
	if (adapter->link_duplex != HALF_DUPLEX)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3057
		goto no_fifo_stall_required;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3058
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3059
	if (atomic_read(&adapter->tx_fifo_stall))
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3060
		return 1;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3061
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3062
	if (skb_fifo_len >= (E1000_82547_PAD_LEN + fifo_space)) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3063
		atomic_set(&adapter->tx_fifo_stall, 1);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3064
		return 1;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3065
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3066
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3067
no_fifo_stall_required:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3068
	adapter->tx_fifo_head += skb_fifo_len;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3069
	if (adapter->tx_fifo_head >= adapter->tx_fifo_size)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3070
		adapter->tx_fifo_head -= adapter->tx_fifo_size;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3071
	return 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3072
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3073
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3074
static int __e1000_maybe_stop_tx(struct net_device *netdev, int size)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3075
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3076
	struct e1000_adapter *adapter = netdev_priv(netdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3077
	struct e1000_tx_ring *tx_ring = adapter->tx_ring;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3078
2589
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2284
diff changeset
  3079
	if (adapter->ecdev) {
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2284
diff changeset
  3080
		return -EBUSY;
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2284
diff changeset
  3081
	}
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2284
diff changeset
  3082
2173
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3083
	netif_stop_queue(netdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3084
	/* Herbert's original patch had:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3085
	 *  smp_mb__after_netif_stop_queue();
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3086
	 * but since that doesn't exist yet, just open code it. */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3087
	smp_mb();
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3088
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3089
	/* We need to check again in a case another CPU has just
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3090
	 * made room available. */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3091
	if (likely(E1000_DESC_UNUSED(tx_ring) < size))
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3092
		return -EBUSY;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3093
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3094
	/* A reprieve! */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3095
	netif_start_queue(netdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3096
	++adapter->restart_queue;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3097
	return 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3098
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3099
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3100
static int e1000_maybe_stop_tx(struct net_device *netdev,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3101
                               struct e1000_tx_ring *tx_ring, int size)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3102
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3103
	if (likely(E1000_DESC_UNUSED(tx_ring) >= size))
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3104
		return 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3105
	return __e1000_maybe_stop_tx(netdev, size);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3106
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3107
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3108
#define TXD_USE_COUNT(S, X) (((S) >> (X)) + 1 )
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3109
static netdev_tx_t e1000_xmit_frame(struct sk_buff *skb,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3110
				    struct net_device *netdev)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3111
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3112
	struct e1000_adapter *adapter = netdev_priv(netdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3113
	struct e1000_hw *hw = &adapter->hw;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3114
	struct e1000_tx_ring *tx_ring;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3115
	unsigned int first, max_per_txd = E1000_MAX_DATA_PER_TXD;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3116
	unsigned int max_txd_pwr = E1000_MAX_TXD_PWR;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3117
	unsigned int tx_flags = 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3118
	unsigned int len = skb_headlen(skb);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3119
	unsigned int nr_frags;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3120
	unsigned int mss;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3121
	int count = 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3122
	int tso;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3123
	unsigned int f;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3124
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3125
	/* This goes back to the question of how to logically map a tx queue
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3126
	 * to a flow.  Right now, performance is impacted slightly negatively
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3127
	 * if using multiple tx queues.  If the stack breaks away from a
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3128
	 * single qdisc implementation, we can look at this again. */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3129
	tx_ring = adapter->tx_ring;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3130
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3131
	if (unlikely(skb->len <= 0)) {
2284
08edb009bee8 Minor: Indentation and braces.
Florian Pose <fp@igh-essen.com>
parents: 2238
diff changeset
  3132
		if (!adapter->ecdev) {
2173
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3133
			dev_kfree_skb_any(skb);
2284
08edb009bee8 Minor: Indentation and braces.
Florian Pose <fp@igh-essen.com>
parents: 2238
diff changeset
  3134
		}
2173
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3135
		return NETDEV_TX_OK;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3136
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3137
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3138
	mss = skb_shinfo(skb)->gso_size;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3139
	/* The controller does a simple calculation to
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3140
	 * make sure there is enough room in the FIFO before
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3141
	 * initiating the DMA for each buffer.  The calc is:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3142
	 * 4 = ceil(buffer len/mss).  To make sure we don't
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3143
	 * overrun the FIFO, adjust the max buffer len if mss
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3144
	 * drops. */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3145
	if (mss) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3146
		u8 hdr_len;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3147
		max_per_txd = min(mss << 2, max_per_txd);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3148
		max_txd_pwr = fls(max_per_txd) - 1;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3149
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3150
		hdr_len = skb_transport_offset(skb) + tcp_hdrlen(skb);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3151
		if (skb->data_len && hdr_len == len) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3152
			switch (hw->mac_type) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3153
				unsigned int pull_size;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3154
			case e1000_82544:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3155
				/* Make sure we have room to chop off 4 bytes,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3156
				 * and that the end alignment will work out to
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3157
				 * this hardware's requirements
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3158
				 * NOTE: this is a TSO only workaround
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3159
				 * if end byte alignment not correct move us
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3160
				 * into the next dword */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3161
				if ((unsigned long)(skb_tail_pointer(skb) - 1) & 4)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3162
					break;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3163
				/* fall through */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3164
				pull_size = min((unsigned int)4, skb->data_len);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3165
				if (!__pskb_pull_tail(skb, pull_size)) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3166
					e_err(drv, "__pskb_pull_tail "
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3167
					      "failed.\n");
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3168
					dev_kfree_skb_any(skb);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3169
					return NETDEV_TX_OK;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3170
				}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3171
				len = skb_headlen(skb);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3172
				break;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3173
			default:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3174
				/* do nothing */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3175
				break;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3176
			}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3177
		}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3178
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3179
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3180
	/* reserve a descriptor for the offload context */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3181
	if ((mss) || (skb->ip_summed == CHECKSUM_PARTIAL))
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3182
		count++;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3183
	count++;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3184
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3185
	/* Controller Erratum workaround */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3186
	if (!skb->data_len && tx_ring->last_tx_tso && !skb_is_gso(skb))
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3187
		count++;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3188
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3189
	count += TXD_USE_COUNT(len, max_txd_pwr);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3190
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3191
	if (adapter->pcix_82544)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3192
		count++;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3193
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3194
	/* work-around for errata 10 and it applies to all controllers
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3195
	 * in PCI-X mode, so add one more descriptor to the count
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3196
	 */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3197
	if (unlikely((hw->bus_type == e1000_bus_type_pcix) &&
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3198
			(len > 2015)))
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3199
		count++;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3200
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3201
	nr_frags = skb_shinfo(skb)->nr_frags;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3202
	for (f = 0; f < nr_frags; f++)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3203
		count += TXD_USE_COUNT(skb_shinfo(skb)->frags[f].size,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3204
				       max_txd_pwr);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3205
	if (adapter->pcix_82544)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3206
		count += nr_frags;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3207
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3208
	/* need: count + 2 desc gap to keep tail from touching
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3209
	 * head, otherwise try next time */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3210
	if (unlikely(e1000_maybe_stop_tx(netdev, tx_ring, count + 2)))
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3211
		return NETDEV_TX_BUSY;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3212
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3213
	if (unlikely(hw->mac_type == e1000_82547)) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3214
		if (unlikely(e1000_82547_fifo_workaround(adapter, skb))) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3215
			if (!adapter->ecdev) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3216
				netif_stop_queue(netdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3217
				if (!test_bit(__E1000_DOWN, &adapter->flags))
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3218
					mod_timer(&adapter->tx_fifo_stall_timer,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3219
					          jiffies + 1);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3220
			}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3221
			return NETDEV_TX_BUSY;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3222
		}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3223
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3224
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3225
	if (unlikely(vlan_tx_tag_present(skb))) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3226
		tx_flags |= E1000_TX_FLAGS_VLAN;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3227
		tx_flags |= (vlan_tx_tag_get(skb) << E1000_TX_FLAGS_VLAN_SHIFT);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3228
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3229
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3230
	first = tx_ring->next_to_use;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3231
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3232
	tso = e1000_tso(adapter, tx_ring, skb);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3233
	if (tso < 0) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3234
		if (!adapter->ecdev) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3235
			dev_kfree_skb_any(skb);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3236
		}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3237
		return NETDEV_TX_OK;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3238
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3239
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3240
	if (likely(tso)) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3241
		if (likely(hw->mac_type != e1000_82544))
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3242
			tx_ring->last_tx_tso = 1;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3243
		tx_flags |= E1000_TX_FLAGS_TSO;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3244
	} else if (likely(e1000_tx_csum(adapter, tx_ring, skb)))
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3245
		tx_flags |= E1000_TX_FLAGS_CSUM;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3246
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3247
	if (likely(skb->protocol == htons(ETH_P_IP)))
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3248
		tx_flags |= E1000_TX_FLAGS_IPV4;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3249
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3250
	count = e1000_tx_map(adapter, tx_ring, skb, first, max_per_txd,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3251
	                     nr_frags, mss);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3252
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3253
	if (count) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3254
		e1000_tx_queue(adapter, tx_ring, tx_flags, count);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3255
		if (!adapter->ecdev) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3256
			/* Make sure there is space in the ring for the next send. */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3257
			e1000_maybe_stop_tx(netdev, tx_ring, MAX_SKB_FRAGS + 2);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3258
		}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3259
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3260
	} else {
2284
08edb009bee8 Minor: Indentation and braces.
Florian Pose <fp@igh-essen.com>
parents: 2238
diff changeset
  3261
		if (!adapter->ecdev) {
08edb009bee8 Minor: Indentation and braces.
Florian Pose <fp@igh-essen.com>
parents: 2238
diff changeset
  3262
			dev_kfree_skb_any(skb);
08edb009bee8 Minor: Indentation and braces.
Florian Pose <fp@igh-essen.com>
parents: 2238
diff changeset
  3263
		}
2173
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3264
		tx_ring->buffer_info[first].time_stamp = 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3265
		tx_ring->next_to_use = first;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3266
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3267
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3268
	return NETDEV_TX_OK;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3269
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3270
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3271
/**
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3272
 * e1000_tx_timeout - Respond to a Tx Hang
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3273
 * @netdev: network interface device structure
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3274
 **/
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3275
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3276
static void e1000_tx_timeout(struct net_device *netdev)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3277
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3278
	struct e1000_adapter *adapter = netdev_priv(netdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3279
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3280
	/* Do the reset outside of interrupt context */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3281
	adapter->tx_timeout_count++;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3282
	schedule_work(&adapter->reset_task);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3283
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3284
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3285
static void e1000_reset_task(struct work_struct *work)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3286
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3287
	struct e1000_adapter *adapter =
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3288
		container_of(work, struct e1000_adapter, reset_task);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3289
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3290
	e1000_reinit_safe(adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3291
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3292
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3293
/**
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3294
 * e1000_get_stats - Get System Network Statistics
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3295
 * @netdev: network interface device structure
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3296
 *
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3297
 * Returns the address of the device statistics structure.
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3298
 * The statistics are actually updated from the timer callback.
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3299
 **/
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3300
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3301
static struct net_device_stats *e1000_get_stats(struct net_device *netdev)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3302
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3303
	/* only return the current stats */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3304
	return &netdev->stats;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3305
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3306
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3307
/**
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3308
 * e1000_change_mtu - Change the Maximum Transfer Unit
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3309
 * @netdev: network interface device structure
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3310
 * @new_mtu: new value for maximum frame size
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3311
 *
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3312
 * Returns 0 on success, negative on failure
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3313
 **/
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3314
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3315
static int e1000_change_mtu(struct net_device *netdev, int new_mtu)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3316
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3317
	struct e1000_adapter *adapter = netdev_priv(netdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3318
	struct e1000_hw *hw = &adapter->hw;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3319
	int max_frame = new_mtu + ENET_HEADER_SIZE + ETHERNET_FCS_SIZE;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3320
2284
08edb009bee8 Minor: Indentation and braces.
Florian Pose <fp@igh-essen.com>
parents: 2238
diff changeset
  3321
	if (adapter->ecdev) {
2173
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3322
		return -EBUSY;
2284
08edb009bee8 Minor: Indentation and braces.
Florian Pose <fp@igh-essen.com>
parents: 2238
diff changeset
  3323
	}
2173
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3324
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3325
	if ((max_frame < MINIMUM_ETHERNET_FRAME_SIZE) ||
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3326
	    (max_frame > MAX_JUMBO_FRAME_SIZE)) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3327
		e_err(probe, "Invalid MTU setting\n");
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3328
		return -EINVAL;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3329
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3330
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3331
	/* Adapter-specific max frame size limits. */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3332
	switch (hw->mac_type) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3333
	case e1000_undefined ... e1000_82542_rev2_1:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3334
		if (max_frame > (ETH_FRAME_LEN + ETH_FCS_LEN)) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3335
			e_err(probe, "Jumbo Frames not supported.\n");
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3336
			return -EINVAL;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3337
		}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3338
		break;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3339
	default:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3340
		/* Capable of supporting up to MAX_JUMBO_FRAME_SIZE limit. */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3341
		break;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3342
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3343
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3344
	while (test_and_set_bit(__E1000_RESETTING, &adapter->flags))
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3345
		msleep(1);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3346
	/* e1000_down has a dependency on max_frame_size */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3347
	hw->max_frame_size = max_frame;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3348
	if (netif_running(netdev))
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3349
		e1000_down(adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3350
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3351
	/* NOTE: netdev_alloc_skb reserves 16 bytes, and typically NET_IP_ALIGN
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3352
	 * means we reserve 2 more, this pushes us to allocate from the next
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3353
	 * larger slab size.
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3354
	 * i.e. RXBUFFER_2048 --> size-4096 slab
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3355
	 *  however with the new *_jumbo_rx* routines, jumbo receives will use
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3356
	 *  fragmented skbs */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3357
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3358
	if (max_frame <= E1000_RXBUFFER_2048)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3359
		adapter->rx_buffer_len = E1000_RXBUFFER_2048;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3360
	else
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3361
#if (PAGE_SIZE >= E1000_RXBUFFER_16384)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3362
		adapter->rx_buffer_len = E1000_RXBUFFER_16384;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3363
#elif (PAGE_SIZE >= E1000_RXBUFFER_4096)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3364
		adapter->rx_buffer_len = PAGE_SIZE;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3365
#endif
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3366
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3367
	/* adjust allocation if LPE protects us, and we aren't using SBP */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3368
	if (!hw->tbi_compatibility_on &&
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3369
	    ((max_frame == (ETH_FRAME_LEN + ETH_FCS_LEN)) ||
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3370
	     (max_frame == MAXIMUM_ETHERNET_VLAN_SIZE)))
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3371
		adapter->rx_buffer_len = MAXIMUM_ETHERNET_VLAN_SIZE;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3372
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3373
	pr_info("%s changing MTU from %d to %d\n",
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3374
		netdev->name, netdev->mtu, new_mtu);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3375
	netdev->mtu = new_mtu;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3376
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3377
	if (netif_running(netdev))
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3378
		e1000_up(adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3379
	else
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3380
		e1000_reset(adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3381
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3382
	clear_bit(__E1000_RESETTING, &adapter->flags);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3383
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3384
	return 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3385
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3386
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3387
/**
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3388
 * e1000_update_stats - Update the board statistics counters
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3389
 * @adapter: board private structure
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3390
 **/
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3391
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3392
void e1000_update_stats(struct e1000_adapter *adapter)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3393
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3394
	struct net_device *netdev = adapter->netdev;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3395
	struct e1000_hw *hw = &adapter->hw;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3396
	struct pci_dev *pdev = adapter->pdev;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3397
	unsigned long flags = 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3398
	u16 phy_tmp;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3399
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3400
#define PHY_IDLE_ERROR_COUNT_MASK 0x00FF
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3401
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3402
	/*
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3403
	 * Prevent stats update while adapter is being reset, or if the pci
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3404
	 * connection is down.
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3405
	 */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3406
	if (adapter->link_speed == 0)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3407
		return;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3408
	if (pci_channel_offline(pdev))
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3409
		return;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3410
2284
08edb009bee8 Minor: Indentation and braces.
Florian Pose <fp@igh-essen.com>
parents: 2238
diff changeset
  3411
	if (!adapter->ecdev) {
2173
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3412
		spin_lock_irqsave(&adapter->stats_lock, flags);
2284
08edb009bee8 Minor: Indentation and braces.
Florian Pose <fp@igh-essen.com>
parents: 2238
diff changeset
  3413
	}
2173
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3414
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3415
	/* these counters are modified from e1000_tbi_adjust_stats,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3416
	 * called from the interrupt context, so they must only
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3417
	 * be written while holding adapter->stats_lock
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3418
	 */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3419
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3420
	adapter->stats.crcerrs += er32(CRCERRS);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3421
	adapter->stats.gprc += er32(GPRC);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3422
	adapter->stats.gorcl += er32(GORCL);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3423
	adapter->stats.gorch += er32(GORCH);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3424
	adapter->stats.bprc += er32(BPRC);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3425
	adapter->stats.mprc += er32(MPRC);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3426
	adapter->stats.roc += er32(ROC);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3427
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3428
	adapter->stats.prc64 += er32(PRC64);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3429
	adapter->stats.prc127 += er32(PRC127);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3430
	adapter->stats.prc255 += er32(PRC255);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3431
	adapter->stats.prc511 += er32(PRC511);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3432
	adapter->stats.prc1023 += er32(PRC1023);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3433
	adapter->stats.prc1522 += er32(PRC1522);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3434
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3435
	adapter->stats.symerrs += er32(SYMERRS);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3436
	adapter->stats.mpc += er32(MPC);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3437
	adapter->stats.scc += er32(SCC);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3438
	adapter->stats.ecol += er32(ECOL);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3439
	adapter->stats.mcc += er32(MCC);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3440
	adapter->stats.latecol += er32(LATECOL);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3441
	adapter->stats.dc += er32(DC);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3442
	adapter->stats.sec += er32(SEC);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3443
	adapter->stats.rlec += er32(RLEC);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3444
	adapter->stats.xonrxc += er32(XONRXC);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3445
	adapter->stats.xontxc += er32(XONTXC);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3446
	adapter->stats.xoffrxc += er32(XOFFRXC);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3447
	adapter->stats.xofftxc += er32(XOFFTXC);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3448
	adapter->stats.fcruc += er32(FCRUC);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3449
	adapter->stats.gptc += er32(GPTC);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3450
	adapter->stats.gotcl += er32(GOTCL);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3451
	adapter->stats.gotch += er32(GOTCH);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3452
	adapter->stats.rnbc += er32(RNBC);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3453
	adapter->stats.ruc += er32(RUC);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3454
	adapter->stats.rfc += er32(RFC);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3455
	adapter->stats.rjc += er32(RJC);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3456
	adapter->stats.torl += er32(TORL);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3457
	adapter->stats.torh += er32(TORH);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3458
	adapter->stats.totl += er32(TOTL);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3459
	adapter->stats.toth += er32(TOTH);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3460
	adapter->stats.tpr += er32(TPR);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3461
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3462
	adapter->stats.ptc64 += er32(PTC64);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3463
	adapter->stats.ptc127 += er32(PTC127);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3464
	adapter->stats.ptc255 += er32(PTC255);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3465
	adapter->stats.ptc511 += er32(PTC511);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3466
	adapter->stats.ptc1023 += er32(PTC1023);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3467
	adapter->stats.ptc1522 += er32(PTC1522);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3468
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3469
	adapter->stats.mptc += er32(MPTC);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3470
	adapter->stats.bptc += er32(BPTC);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3471
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3472
	/* used for adaptive IFS */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3473
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3474
	hw->tx_packet_delta = er32(TPT);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3475
	adapter->stats.tpt += hw->tx_packet_delta;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3476
	hw->collision_delta = er32(COLC);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3477
	adapter->stats.colc += hw->collision_delta;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3478
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3479
	if (hw->mac_type >= e1000_82543) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3480
		adapter->stats.algnerrc += er32(ALGNERRC);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3481
		adapter->stats.rxerrc += er32(RXERRC);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3482
		adapter->stats.tncrs += er32(TNCRS);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3483
		adapter->stats.cexterr += er32(CEXTERR);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3484
		adapter->stats.tsctc += er32(TSCTC);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3485
		adapter->stats.tsctfc += er32(TSCTFC);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3486
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3487
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3488
	/* Fill out the OS statistics structure */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3489
	netdev->stats.multicast = adapter->stats.mprc;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3490
	netdev->stats.collisions = adapter->stats.colc;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3491
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3492
	/* Rx Errors */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3493
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3494
	/* RLEC on some newer hardware can be incorrect so build
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3495
	* our own version based on RUC and ROC */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3496
	netdev->stats.rx_errors = adapter->stats.rxerrc +
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3497
		adapter->stats.crcerrs + adapter->stats.algnerrc +
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3498
		adapter->stats.ruc + adapter->stats.roc +
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3499
		adapter->stats.cexterr;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3500
	adapter->stats.rlerrc = adapter->stats.ruc + adapter->stats.roc;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3501
	netdev->stats.rx_length_errors = adapter->stats.rlerrc;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3502
	netdev->stats.rx_crc_errors = adapter->stats.crcerrs;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3503
	netdev->stats.rx_frame_errors = adapter->stats.algnerrc;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3504
	netdev->stats.rx_missed_errors = adapter->stats.mpc;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3505
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3506
	/* Tx Errors */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3507
	adapter->stats.txerrc = adapter->stats.ecol + adapter->stats.latecol;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3508
	netdev->stats.tx_errors = adapter->stats.txerrc;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3509
	netdev->stats.tx_aborted_errors = adapter->stats.ecol;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3510
	netdev->stats.tx_window_errors = adapter->stats.latecol;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3511
	netdev->stats.tx_carrier_errors = adapter->stats.tncrs;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3512
	if (hw->bad_tx_carr_stats_fd &&
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3513
	    adapter->link_duplex == FULL_DUPLEX) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3514
		netdev->stats.tx_carrier_errors = 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3515
		adapter->stats.tncrs = 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3516
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3517
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3518
	/* Tx Dropped needs to be maintained elsewhere */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3519
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3520
	/* Phy Stats */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3521
	if (hw->media_type == e1000_media_type_copper) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3522
		if ((adapter->link_speed == SPEED_1000) &&
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3523
		   (!e1000_read_phy_reg(hw, PHY_1000T_STATUS, &phy_tmp))) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3524
			phy_tmp &= PHY_IDLE_ERROR_COUNT_MASK;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3525
			adapter->phy_stats.idle_errors += phy_tmp;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3526
		}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3527
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3528
		if ((hw->mac_type <= e1000_82546) &&
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3529
		   (hw->phy_type == e1000_phy_m88) &&
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3530
		   !e1000_read_phy_reg(hw, M88E1000_RX_ERR_CNTR, &phy_tmp))
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3531
			adapter->phy_stats.receive_errors += phy_tmp;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3532
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3533
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3534
	/* Management Stats */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3535
	if (hw->has_smbus) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3536
		adapter->stats.mgptc += er32(MGTPTC);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3537
		adapter->stats.mgprc += er32(MGTPRC);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3538
		adapter->stats.mgpdc += er32(MGTPDC);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3539
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3540
2284
08edb009bee8 Minor: Indentation and braces.
Florian Pose <fp@igh-essen.com>
parents: 2238
diff changeset
  3541
	if (!adapter->ecdev) {
2173
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3542
		spin_unlock_irqrestore(&adapter->stats_lock, flags);
2284
08edb009bee8 Minor: Indentation and braces.
Florian Pose <fp@igh-essen.com>
parents: 2238
diff changeset
  3543
	}
2173
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3544
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3545
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3546
void ec_poll(struct net_device *netdev)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3547
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3548
	struct e1000_adapter *adapter = netdev_priv(netdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3549
	if (jiffies - adapter->ec_watchdog_jiffies >= 2 * HZ) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3550
		e1000_watchdog((unsigned long) adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3551
		adapter->ec_watchdog_jiffies = jiffies;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3552
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3553
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3554
	e1000_intr(0, netdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3555
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3556
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3557
/**
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3558
 * e1000_intr - Interrupt Handler
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3559
 * @irq: interrupt number
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3560
 * @data: pointer to a network interface device structure
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3561
 **/
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3562
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3563
static irqreturn_t e1000_intr(int irq, void *data)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3564
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3565
	struct net_device *netdev = data;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3566
	struct e1000_adapter *adapter = netdev_priv(netdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3567
	struct e1000_hw *hw = &adapter->hw;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3568
	u32 icr = er32(ICR);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3569
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3570
	if (unlikely((!icr) || test_bit(__E1000_DOWN, &adapter->flags)))
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3571
		return IRQ_NONE;  /* Not our interrupt */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3572
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3573
    if (unlikely(icr & (E1000_ICR_RXSEQ | E1000_ICR_LSC))) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3574
		hw->get_link_status = 1;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3575
		/* guard against interrupt when we're going down */
2213
be3291de22e3 Avoided enabling timer.
Florian Pose <fp@igh-essen.com>
parents: 2173
diff changeset
  3576
		if (!adapter->ecdev && !test_bit(__E1000_DOWN, &adapter->flags))
2173
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3577
			mod_timer(&adapter->watchdog_timer, jiffies + 1);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3578
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3579
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3580
	if (adapter->ecdev) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3581
		int i, ec_work_done = 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3582
		for (i = 0; i < E1000_MAX_INTR; i++) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3583
			if (unlikely(!adapter->clean_rx(adapter, adapter->rx_ring,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3584
							&ec_work_done, 100) &&
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3585
						!e1000_clean_tx_irq(adapter, adapter->tx_ring))) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3586
				break;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3587
			}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3588
		}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3589
	} else {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3590
		/* disable interrupts, without the synchronize_irq bit */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3591
		ew32(IMC, ~0);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3592
		E1000_WRITE_FLUSH();
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3593
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3594
		if (likely(napi_schedule_prep(&adapter->napi))) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3595
			adapter->total_tx_bytes = 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3596
			adapter->total_tx_packets = 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3597
			adapter->total_rx_bytes = 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3598
			adapter->total_rx_packets = 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3599
			__napi_schedule(&adapter->napi);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3600
		} else {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3601
			/* this really should not happen! if it does it is basically a
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3602
			 * bug, but not a hard error, so enable ints and continue */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3603
			if (!test_bit(__E1000_DOWN, &adapter->flags))
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3604
				e1000_irq_enable(adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3605
		}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3606
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3607
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3608
	return IRQ_HANDLED;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3609
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3610
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3611
/**
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3612
 * e1000_clean - NAPI Rx polling callback
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3613
 * @adapter: board private structure
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3614
 * EtherCAT: never called
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3615
 **/
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3616
static int e1000_clean(struct napi_struct *napi, int budget)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3617
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3618
	struct e1000_adapter *adapter = container_of(napi, struct e1000_adapter, napi);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3619
	int tx_clean_complete = 0, work_done = 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3620
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3621
	tx_clean_complete = e1000_clean_tx_irq(adapter, &adapter->tx_ring[0]);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3622
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3623
	adapter->clean_rx(adapter, &adapter->rx_ring[0], &work_done, budget);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3624
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3625
	if (!tx_clean_complete)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3626
		work_done = budget;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3627
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3628
	/* If budget not fully consumed, exit the polling mode */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3629
	if (work_done < budget) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3630
		if (likely(adapter->itr_setting & 3))
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3631
			e1000_set_itr(adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3632
		napi_complete(napi);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3633
		if (!test_bit(__E1000_DOWN, &adapter->flags))
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3634
			e1000_irq_enable(adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3635
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3636
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3637
	return work_done;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3638
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3639
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3640
/**
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3641
 * e1000_clean_tx_irq - Reclaim resources after transmit completes
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3642
 * @adapter: board private structure
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3643
 **/
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3644
static bool e1000_clean_tx_irq(struct e1000_adapter *adapter,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3645
			       struct e1000_tx_ring *tx_ring)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3646
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3647
	struct e1000_hw *hw = &adapter->hw;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3648
	struct net_device *netdev = adapter->netdev;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3649
	struct e1000_tx_desc *tx_desc, *eop_desc;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3650
	struct e1000_buffer *buffer_info;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3651
	unsigned int i, eop;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3652
	unsigned int count = 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3653
	unsigned int total_tx_bytes=0, total_tx_packets=0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3654
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3655
	i = tx_ring->next_to_clean;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3656
	eop = tx_ring->buffer_info[i].next_to_watch;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3657
	eop_desc = E1000_TX_DESC(*tx_ring, eop);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3658
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3659
	while ((eop_desc->upper.data & cpu_to_le32(E1000_TXD_STAT_DD)) &&
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3660
	       (count < tx_ring->count)) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3661
		bool cleaned = false;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3662
		rmb();	/* read buffer_info after eop_desc */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3663
		for ( ; !cleaned; count++) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3664
			tx_desc = E1000_TX_DESC(*tx_ring, i);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3665
			buffer_info = &tx_ring->buffer_info[i];
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3666
			cleaned = (i == eop);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3667
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3668
			if (cleaned) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3669
				struct sk_buff *skb = buffer_info->skb;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3670
				unsigned int segs, bytecount;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3671
				segs = skb_shinfo(skb)->gso_segs ?: 1;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3672
				/* multiply data chunks by size of headers */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3673
				bytecount = ((segs - 1) * skb_headlen(skb)) +
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3674
				            skb->len;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3675
				total_tx_packets += segs;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3676
				total_tx_bytes += bytecount;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3677
			}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3678
			e1000_unmap_and_free_tx_resource(adapter, buffer_info);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3679
			tx_desc->upper.data = 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3680
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3681
			if (unlikely(++i == tx_ring->count)) i = 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3682
		}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3683
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3684
		eop = tx_ring->buffer_info[i].next_to_watch;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3685
		eop_desc = E1000_TX_DESC(*tx_ring, eop);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3686
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3687
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3688
	tx_ring->next_to_clean = i;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3689
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3690
#define TX_WAKE_THRESHOLD 32
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3691
	if (!adapter->ecdev && unlikely(count && netif_carrier_ok(netdev) &&
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3692
		     E1000_DESC_UNUSED(tx_ring) >= TX_WAKE_THRESHOLD)) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3693
		/* Make sure that anybody stopping the queue after this
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3694
		 * sees the new next_to_clean.
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3695
		 */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3696
		smp_mb();
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3697
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3698
		if (netif_queue_stopped(netdev) &&
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3699
		    !(test_bit(__E1000_DOWN, &adapter->flags))) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3700
			netif_wake_queue(netdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3701
			++adapter->restart_queue;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3702
		}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3703
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3704
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3705
	if (!adapter->ecdev && adapter->detect_tx_hung) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3706
		/* Detect a transmit hang in hardware, this serializes the
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3707
		 * check with the clearing of time_stamp and movement of i */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3708
		adapter->detect_tx_hung = false;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3709
		if (tx_ring->buffer_info[eop].time_stamp &&
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3710
		    time_after(jiffies, tx_ring->buffer_info[eop].time_stamp +
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3711
		               (adapter->tx_timeout_factor * HZ)) &&
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3712
		    !(er32(STATUS) & E1000_STATUS_TXOFF)) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3713
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3714
			/* detected Tx unit hang */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3715
			e_err(drv, "Detected Tx Unit Hang\n"
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3716
			      "  Tx Queue             <%lu>\n"
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3717
			      "  TDH                  <%x>\n"
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3718
			      "  TDT                  <%x>\n"
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3719
			      "  next_to_use          <%x>\n"
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3720
			      "  next_to_clean        <%x>\n"
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3721
			      "buffer_info[next_to_clean]\n"
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3722
			      "  time_stamp           <%lx>\n"
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3723
			      "  next_to_watch        <%x>\n"
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3724
			      "  jiffies              <%lx>\n"
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3725
			      "  next_to_watch.status <%x>\n",
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3726
				(unsigned long)((tx_ring - adapter->tx_ring) /
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3727
					sizeof(struct e1000_tx_ring)),
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3728
				readl(hw->hw_addr + tx_ring->tdh),
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3729
				readl(hw->hw_addr + tx_ring->tdt),
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3730
				tx_ring->next_to_use,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3731
				tx_ring->next_to_clean,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3732
				tx_ring->buffer_info[eop].time_stamp,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3733
				eop,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3734
				jiffies,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3735
				eop_desc->upper.fields.status);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3736
			netif_stop_queue(netdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3737
		}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3738
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3739
	adapter->total_tx_bytes += total_tx_bytes;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3740
	adapter->total_tx_packets += total_tx_packets;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3741
	netdev->stats.tx_bytes += total_tx_bytes;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3742
	netdev->stats.tx_packets += total_tx_packets;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3743
	return count < tx_ring->count;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3744
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3745
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3746
/**
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3747
 * e1000_rx_checksum - Receive Checksum Offload for 82543
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3748
 * @adapter:     board private structure
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3749
 * @status_err:  receive descriptor status and error fields
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3750
 * @csum:        receive descriptor csum field
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3751
 * @sk_buff:     socket buffer with received data
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3752
 **/
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3753
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3754
static void e1000_rx_checksum(struct e1000_adapter *adapter, u32 status_err,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3755
			      u32 csum, struct sk_buff *skb)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3756
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3757
	struct e1000_hw *hw = &adapter->hw;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3758
	u16 status = (u16)status_err;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3759
	u8 errors = (u8)(status_err >> 24);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3760
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3761
	skb_checksum_none_assert(skb);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3762
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3763
	/* 82543 or newer only */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3764
	if (unlikely(hw->mac_type < e1000_82543)) return;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3765
	/* Ignore Checksum bit is set */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3766
	if (unlikely(status & E1000_RXD_STAT_IXSM)) return;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3767
	/* TCP/UDP checksum error bit is set */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3768
	if (unlikely(errors & E1000_RXD_ERR_TCPE)) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3769
		/* let the stack verify checksum errors */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3770
		adapter->hw_csum_err++;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3771
		return;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3772
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3773
	/* TCP/UDP Checksum has not been calculated */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3774
	if (!(status & E1000_RXD_STAT_TCPCS))
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3775
		return;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3776
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3777
	/* It must be a TCP or UDP packet with a valid checksum */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3778
	if (likely(status & E1000_RXD_STAT_TCPCS)) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3779
		/* TCP checksum is good */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3780
		skb->ip_summed = CHECKSUM_UNNECESSARY;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3781
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3782
	adapter->hw_csum_good++;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3783
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3784
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3785
/**
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3786
 * e1000_consume_page - helper function
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3787
 **/
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3788
static void e1000_consume_page(struct e1000_buffer *bi, struct sk_buff *skb,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3789
                               u16 length)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3790
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3791
	bi->page = NULL;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3792
	skb->len += length;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3793
	skb->data_len += length;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3794
	skb->truesize += length;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3795
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3796
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3797
/**
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3798
 * e1000_receive_skb - helper function to handle rx indications
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3799
 * @adapter: board private structure
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3800
 * @status: descriptor status field as written by hardware
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3801
 * @vlan: descriptor vlan field as written by hardware (no le/be conversion)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3802
 * @skb: pointer to sk_buff to be indicated to stack
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3803
 */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3804
static void e1000_receive_skb(struct e1000_adapter *adapter, u8 status,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3805
			      __le16 vlan, struct sk_buff *skb)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3806
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3807
	skb->protocol = eth_type_trans(skb, adapter->netdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3808
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3809
	if ((unlikely(adapter->vlgrp && (status & E1000_RXD_STAT_VP))))
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3810
		vlan_gro_receive(&adapter->napi, adapter->vlgrp,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3811
				 le16_to_cpu(vlan) & E1000_RXD_SPC_VLAN_MASK,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3812
				 skb);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3813
	else
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3814
		napi_gro_receive(&adapter->napi, skb);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3815
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3816
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3817
/**
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3818
 * e1000_clean_jumbo_rx_irq - Send received data up the network stack; legacy
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3819
 * @adapter: board private structure
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3820
 * @rx_ring: ring to clean
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3821
 * @work_done: amount of napi work completed this call
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3822
 * @work_to_do: max amount of work allowed for this call to do
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3823
 *
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3824
 * the return value indicates whether actual cleaning was done, there
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3825
 * is no guarantee that everything was cleaned
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3826
 */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3827
static bool e1000_clean_jumbo_rx_irq(struct e1000_adapter *adapter,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3828
				     struct e1000_rx_ring *rx_ring,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3829
				     int *work_done, int work_to_do)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3830
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3831
	struct e1000_hw *hw = &adapter->hw;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3832
	struct net_device *netdev = adapter->netdev;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3833
	struct pci_dev *pdev = adapter->pdev;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3834
	struct e1000_rx_desc *rx_desc, *next_rxd;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3835
	struct e1000_buffer *buffer_info, *next_buffer;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3836
	unsigned long irq_flags;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3837
	u32 length;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3838
	unsigned int i;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3839
	int cleaned_count = 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3840
	bool cleaned = false;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3841
	unsigned int total_rx_bytes=0, total_rx_packets=0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3842
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3843
	i = rx_ring->next_to_clean;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3844
	rx_desc = E1000_RX_DESC(*rx_ring, i);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3845
	buffer_info = &rx_ring->buffer_info[i];
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3846
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3847
	while (rx_desc->status & E1000_RXD_STAT_DD) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3848
		struct sk_buff *skb;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3849
		u8 status;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3850
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3851
		if (*work_done >= work_to_do)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3852
			break;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3853
		(*work_done)++;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3854
		rmb(); /* read descriptor and rx_buffer_info after status DD */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3855
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3856
		status = rx_desc->status;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3857
		skb = buffer_info->skb;
2284
08edb009bee8 Minor: Indentation and braces.
Florian Pose <fp@igh-essen.com>
parents: 2238
diff changeset
  3858
		if (!adapter->ecdev) {
08edb009bee8 Minor: Indentation and braces.
Florian Pose <fp@igh-essen.com>
parents: 2238
diff changeset
  3859
			buffer_info->skb = NULL;
08edb009bee8 Minor: Indentation and braces.
Florian Pose <fp@igh-essen.com>
parents: 2238
diff changeset
  3860
		}
2173
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3861
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3862
		if (++i == rx_ring->count) i = 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3863
		next_rxd = E1000_RX_DESC(*rx_ring, i);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3864
		prefetch(next_rxd);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3865
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3866
		next_buffer = &rx_ring->buffer_info[i];
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3867
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3868
		cleaned = true;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3869
		cleaned_count++;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3870
		dma_unmap_page(&pdev->dev, buffer_info->dma,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3871
			       buffer_info->length, DMA_FROM_DEVICE);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3872
		buffer_info->dma = 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3873
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3874
		length = le16_to_cpu(rx_desc->length);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3875
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3876
		/* errors is only valid for DD + EOP descriptors */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3877
		if (!adapter->ecdev &&
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3878
		    unlikely((status & E1000_RXD_STAT_EOP) &&
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3879
		    (rx_desc->errors & E1000_RXD_ERR_FRAME_ERR_MASK))) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3880
			u8 last_byte = *(skb->data + length - 1);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3881
			if (TBI_ACCEPT(hw, status, rx_desc->errors, length,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3882
				       last_byte)) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3883
				spin_lock_irqsave(&adapter->stats_lock,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3884
				                  irq_flags);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3885
				e1000_tbi_adjust_stats(hw, &adapter->stats,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3886
				                       length, skb->data);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3887
				spin_unlock_irqrestore(&adapter->stats_lock,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3888
				                       irq_flags);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3889
				length--;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3890
			} else {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3891
				/* recycle both page and skb */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3892
				buffer_info->skb = skb;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3893
				/* an error means any chain goes out the window
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3894
				 * too */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3895
				if (rx_ring->rx_skb_top)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3896
					dev_kfree_skb(rx_ring->rx_skb_top);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3897
				rx_ring->rx_skb_top = NULL;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3898
				goto next_desc;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3899
			}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3900
		}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3901
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3902
#define rxtop rx_ring->rx_skb_top
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3903
		if (!(status & E1000_RXD_STAT_EOP)) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3904
			/* this descriptor is only the beginning (or middle) */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3905
			if (!rxtop) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3906
				/* this is the beginning of a chain */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3907
				rxtop = skb;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3908
				skb_fill_page_desc(rxtop, 0, buffer_info->page,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3909
				                   0, length);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3910
			} else {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3911
				/* this is the middle of a chain */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3912
				skb_fill_page_desc(rxtop,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3913
				    skb_shinfo(rxtop)->nr_frags,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3914
				    buffer_info->page, 0, length);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3915
				/* re-use the skb, only consumed the page */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3916
				buffer_info->skb = skb;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3917
			}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3918
			e1000_consume_page(buffer_info, rxtop, length);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3919
			goto next_desc;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3920
		} else {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3921
			if (rxtop) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3922
				/* end of the chain */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3923
				skb_fill_page_desc(rxtop,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3924
				    skb_shinfo(rxtop)->nr_frags,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3925
				    buffer_info->page, 0, length);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3926
				/* re-use the current skb, we only consumed the
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3927
				 * page */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3928
				buffer_info->skb = skb;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3929
				skb = rxtop;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3930
				rxtop = NULL;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3931
				e1000_consume_page(buffer_info, skb, length);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3932
			} else {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3933
				/* no chain, got EOP, this buf is the packet
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3934
				 * copybreak to save the put_page/alloc_page */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3935
				if (length <= copybreak &&
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3936
				    skb_tailroom(skb) >= length) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3937
					u8 *vaddr;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3938
					vaddr = kmap_atomic(buffer_info->page,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3939
					                    KM_SKB_DATA_SOFTIRQ);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3940
					memcpy(skb_tail_pointer(skb), vaddr, length);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3941
					kunmap_atomic(vaddr,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3942
					              KM_SKB_DATA_SOFTIRQ);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3943
					/* re-use the page, so don't erase
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3944
					 * buffer_info->page */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3945
					skb_put(skb, length);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3946
				} else {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3947
					skb_fill_page_desc(skb, 0,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3948
					                   buffer_info->page, 0,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3949
				                           length);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3950
					e1000_consume_page(buffer_info, skb,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3951
					                   length);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3952
				}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3953
			}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3954
		}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3955
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3956
		/* Receive Checksum Offload XXX recompute due to CRC strip? */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3957
		e1000_rx_checksum(adapter,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3958
		                  (u32)(status) |
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3959
		                  ((u32)(rx_desc->errors) << 24),
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3960
		                  le16_to_cpu(rx_desc->csum), skb);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3961
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3962
		pskb_trim(skb, skb->len - 4);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3963
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3964
		/* probably a little skewed due to removing CRC */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3965
		total_rx_bytes += skb->len;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3966
		total_rx_packets++;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3967
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3968
		/* eth type trans needs skb->data to point to something */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3969
		if (!pskb_may_pull(skb, ETH_HLEN)) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3970
			e_err(drv, "pskb_may_pull failed.\n");
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3971
			if (!adapter->ecdev) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3972
				dev_kfree_skb(skb);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3973
			}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3974
			goto next_desc;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3975
		}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3976
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3977
		if (adapter->ecdev) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3978
			ecdev_receive(adapter->ecdev, skb->data, length);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3979
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3980
			// No need to detect link status as
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3981
			// long as frames are received: Reset watchdog.
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3982
			adapter->ec_watchdog_jiffies = jiffies;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3983
		} else {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3984
			e1000_receive_skb(adapter, status, rx_desc->special, skb);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3985
		}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3986
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3987
next_desc:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3988
		rx_desc->status = 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3989
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3990
		/* return some buffers to hardware, one at a time is too slow */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3991
		if (unlikely(cleaned_count >= E1000_RX_BUFFER_WRITE)) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3992
			adapter->alloc_rx_buf(adapter, rx_ring, cleaned_count);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3993
			cleaned_count = 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3994
		}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3995
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3996
		/* use prefetched values */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3997
		rx_desc = next_rxd;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3998
		buffer_info = next_buffer;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3999
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4000
	rx_ring->next_to_clean = i;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4001
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4002
	cleaned_count = E1000_DESC_UNUSED(rx_ring);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4003
	if (cleaned_count)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4004
		adapter->alloc_rx_buf(adapter, rx_ring, cleaned_count);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4005
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4006
	adapter->total_rx_packets += total_rx_packets;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4007
	adapter->total_rx_bytes += total_rx_bytes;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4008
	netdev->stats.rx_bytes += total_rx_bytes;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4009
	netdev->stats.rx_packets += total_rx_packets;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4010
	return cleaned;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4011
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4012
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4013
/*
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4014
 * this should improve performance for small packets with large amounts
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4015
 * of reassembly being done in the stack
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4016
 */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4017
static void e1000_check_copybreak(struct net_device *netdev,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4018
				 struct e1000_buffer *buffer_info,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4019
				 u32 length, struct sk_buff **skb)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4020
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4021
	struct e1000_adapter *adapter = netdev_priv(netdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4022
	struct sk_buff *new_skb;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4023
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4024
	if (adapter->ecdev || length > copybreak)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4025
		return;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4026
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4027
	new_skb = netdev_alloc_skb_ip_align(netdev, length);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4028
	if (!new_skb)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4029
		return;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4030
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4031
	skb_copy_to_linear_data_offset(new_skb, -NET_IP_ALIGN,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4032
				       (*skb)->data - NET_IP_ALIGN,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4033
				       length + NET_IP_ALIGN);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4034
	/* save the skb in buffer_info as good */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4035
	buffer_info->skb = *skb;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4036
	*skb = new_skb;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4037
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4038
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4039
/**
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4040
 * e1000_clean_rx_irq - Send received data up the network stack; legacy
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4041
 * @adapter: board private structure
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4042
 * @rx_ring: ring to clean
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4043
 * @work_done: amount of napi work completed this call
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4044
 * @work_to_do: max amount of work allowed for this call to do
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4045
 */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4046
static bool e1000_clean_rx_irq(struct e1000_adapter *adapter,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4047
			       struct e1000_rx_ring *rx_ring,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4048
			       int *work_done, int work_to_do)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4049
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4050
	struct e1000_hw *hw = &adapter->hw;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4051
	struct net_device *netdev = adapter->netdev;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4052
	struct pci_dev *pdev = adapter->pdev;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4053
	struct e1000_rx_desc *rx_desc, *next_rxd;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4054
	struct e1000_buffer *buffer_info, *next_buffer;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4055
	unsigned long flags;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4056
	u32 length;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4057
	unsigned int i;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4058
	int cleaned_count = 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4059
	bool cleaned = false;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4060
	unsigned int total_rx_bytes=0, total_rx_packets=0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4061
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4062
	i = rx_ring->next_to_clean;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4063
	rx_desc = E1000_RX_DESC(*rx_ring, i);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4064
	buffer_info = &rx_ring->buffer_info[i];
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4065
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4066
	while (rx_desc->status & E1000_RXD_STAT_DD) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4067
		struct sk_buff *skb;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4068
		u8 status;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4069
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4070
		if (*work_done >= work_to_do)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4071
			break;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4072
		(*work_done)++;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4073
		rmb(); /* read descriptor and rx_buffer_info after status DD */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4074
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4075
		status = rx_desc->status;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4076
		skb = buffer_info->skb;
2284
08edb009bee8 Minor: Indentation and braces.
Florian Pose <fp@igh-essen.com>
parents: 2238
diff changeset
  4077
		if (!adapter->ecdev) {
08edb009bee8 Minor: Indentation and braces.
Florian Pose <fp@igh-essen.com>
parents: 2238
diff changeset
  4078
			buffer_info->skb = NULL;
08edb009bee8 Minor: Indentation and braces.
Florian Pose <fp@igh-essen.com>
parents: 2238
diff changeset
  4079
		}
2173
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4080
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4081
		prefetch(skb->data - NET_IP_ALIGN);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4082
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4083
		if (++i == rx_ring->count) i = 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4084
		next_rxd = E1000_RX_DESC(*rx_ring, i);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4085
		prefetch(next_rxd);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4086
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4087
		next_buffer = &rx_ring->buffer_info[i];
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4088
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4089
		cleaned = true;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4090
		cleaned_count++;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4091
		dma_unmap_single(&pdev->dev, buffer_info->dma,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4092
				 buffer_info->length, DMA_FROM_DEVICE);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4093
		buffer_info->dma = 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4094
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4095
		length = le16_to_cpu(rx_desc->length);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4096
		/* !EOP means multiple descriptors were used to store a single
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4097
		 * packet, if thats the case we need to toss it.  In fact, we
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4098
		 * to toss every packet with the EOP bit clear and the next
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4099
		 * frame that _does_ have the EOP bit set, as it is by
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4100
		 * definition only a frame fragment
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4101
		 */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4102
		if (unlikely(!(status & E1000_RXD_STAT_EOP)))
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4103
			adapter->discarding = true;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4104
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4105
		if (adapter->discarding) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4106
			/* All receives must fit into a single buffer */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4107
			e_dbg("Receive packet consumed multiple buffers\n");
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4108
			/* recycle */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4109
			buffer_info->skb = skb;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4110
			if (status & E1000_RXD_STAT_EOP)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4111
				adapter->discarding = false;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4112
			goto next_desc;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4113
		}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4114
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4115
		if (!adapter->ecdev &&
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4116
		    unlikely(rx_desc->errors & E1000_RXD_ERR_FRAME_ERR_MASK)) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4117
			u8 last_byte = *(skb->data + length - 1);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4118
			if (TBI_ACCEPT(hw, status, rx_desc->errors, length,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4119
				       last_byte)) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4120
				spin_lock_irqsave(&adapter->stats_lock, flags);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4121
				e1000_tbi_adjust_stats(hw, &adapter->stats,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4122
				                       length, skb->data);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4123
				spin_unlock_irqrestore(&adapter->stats_lock,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4124
				                       flags);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4125
				length--;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4126
			} else {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4127
				/* recycle */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4128
				buffer_info->skb = skb;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4129
				goto next_desc;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4130
			}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4131
		}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4132
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4133
		/* adjust length to remove Ethernet CRC, this must be
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4134
		 * done after the TBI_ACCEPT workaround above */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4135
		length -= 4;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4136
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4137
		/* probably a little skewed due to removing CRC */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4138
		total_rx_bytes += length;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4139
		total_rx_packets++;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4140
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4141
		e1000_check_copybreak(netdev, buffer_info, length, &skb);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4142
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4143
		skb_put(skb, length);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4144
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4145
		/* Receive Checksum Offload */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4146
		e1000_rx_checksum(adapter,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4147
				  (u32)(status) |
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4148
				  ((u32)(rx_desc->errors) << 24),
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4149
				  le16_to_cpu(rx_desc->csum), skb);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4150
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4151
		if (adapter->ecdev) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4152
			ecdev_receive(adapter->ecdev, skb->data, length);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4153
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4154
			// No need to detect link status as
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4155
			// long as frames are received: Reset watchdog.
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4156
			adapter->ec_watchdog_jiffies = jiffies;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4157
		} else {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4158
			e1000_receive_skb(adapter, status, rx_desc->special, skb);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4159
		}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4160
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4161
next_desc:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4162
		rx_desc->status = 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4163
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4164
		/* return some buffers to hardware, one at a time is too slow */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4165
		if (unlikely(cleaned_count >= E1000_RX_BUFFER_WRITE)) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4166
			adapter->alloc_rx_buf(adapter, rx_ring, cleaned_count);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4167
			cleaned_count = 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4168
		}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4169
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4170
		/* use prefetched values */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4171
		rx_desc = next_rxd;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4172
		buffer_info = next_buffer;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4173
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4174
	rx_ring->next_to_clean = i;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4175
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4176
	cleaned_count = E1000_DESC_UNUSED(rx_ring);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4177
	if (cleaned_count)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4178
		adapter->alloc_rx_buf(adapter, rx_ring, cleaned_count);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4179
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4180
	adapter->total_rx_packets += total_rx_packets;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4181
	adapter->total_rx_bytes += total_rx_bytes;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4182
	netdev->stats.rx_bytes += total_rx_bytes;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4183
	netdev->stats.rx_packets += total_rx_packets;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4184
	return cleaned;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4185
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4186
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4187
/**
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4188
 * e1000_alloc_jumbo_rx_buffers - Replace used jumbo receive buffers
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4189
 * @adapter: address of board private structure
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4190
 * @rx_ring: pointer to receive ring structure
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4191
 * @cleaned_count: number of buffers to allocate this pass
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4192
 **/
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4193
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4194
static void
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4195
e1000_alloc_jumbo_rx_buffers(struct e1000_adapter *adapter,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4196
                             struct e1000_rx_ring *rx_ring, int cleaned_count)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4197
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4198
	struct net_device *netdev = adapter->netdev;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4199
	struct pci_dev *pdev = adapter->pdev;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4200
	struct e1000_rx_desc *rx_desc;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4201
	struct e1000_buffer *buffer_info;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4202
	struct sk_buff *skb;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4203
	unsigned int i;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4204
	unsigned int bufsz = 256 - 16 /*for skb_reserve */ ;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4205
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4206
	i = rx_ring->next_to_use;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4207
	buffer_info = &rx_ring->buffer_info[i];
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4208
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4209
	while (cleaned_count--) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4210
		skb = buffer_info->skb;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4211
		if (skb) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4212
			skb_trim(skb, 0);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4213
			goto check_page;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4214
		}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4215
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4216
		skb = netdev_alloc_skb_ip_align(netdev, bufsz);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4217
		if (unlikely(!skb)) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4218
			/* Better luck next round */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4219
			adapter->alloc_rx_buff_failed++;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4220
			break;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4221
		}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4222
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4223
		/* Fix for errata 23, can't cross 64kB boundary */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4224
		if (!e1000_check_64k_bound(adapter, skb->data, bufsz)) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4225
			struct sk_buff *oldskb = skb;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4226
			e_err(rx_err, "skb align check failed: %u bytes at "
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4227
			      "%p\n", bufsz, skb->data);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4228
			/* Try again, without freeing the previous */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4229
			skb = netdev_alloc_skb_ip_align(netdev, bufsz);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4230
			/* Failed allocation, critical failure */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4231
			if (!skb) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4232
				dev_kfree_skb(oldskb);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4233
				adapter->alloc_rx_buff_failed++;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4234
				break;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4235
			}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4236
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4237
			if (!e1000_check_64k_bound(adapter, skb->data, bufsz)) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4238
				/* give up */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4239
				dev_kfree_skb(skb);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4240
				dev_kfree_skb(oldskb);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4241
				break; /* while (cleaned_count--) */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4242
			}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4243
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4244
			/* Use new allocation */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4245
			dev_kfree_skb(oldskb);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4246
		}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4247
		buffer_info->skb = skb;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4248
		buffer_info->length = adapter->rx_buffer_len;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4249
check_page:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4250
		/* allocate a new page if necessary */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4251
		if (!buffer_info->page) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4252
			buffer_info->page = alloc_page(GFP_ATOMIC);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4253
			if (unlikely(!buffer_info->page)) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4254
				adapter->alloc_rx_buff_failed++;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4255
				break;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4256
			}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4257
		}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4258
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4259
		if (!buffer_info->dma) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4260
			buffer_info->dma = dma_map_page(&pdev->dev,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4261
			                                buffer_info->page, 0,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4262
							buffer_info->length,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4263
							DMA_FROM_DEVICE);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4264
			if (dma_mapping_error(&pdev->dev, buffer_info->dma)) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4265
				put_page(buffer_info->page);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4266
				dev_kfree_skb(skb);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4267
				buffer_info->page = NULL;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4268
				buffer_info->skb = NULL;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4269
				buffer_info->dma = 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4270
				adapter->alloc_rx_buff_failed++;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4271
				break; /* while !buffer_info->skb */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4272
			}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4273
		}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4274
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4275
		rx_desc = E1000_RX_DESC(*rx_ring, i);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4276
		rx_desc->buffer_addr = cpu_to_le64(buffer_info->dma);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4277
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4278
		if (unlikely(++i == rx_ring->count))
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4279
			i = 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4280
		buffer_info = &rx_ring->buffer_info[i];
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4281
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4282
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4283
	if (likely(rx_ring->next_to_use != i)) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4284
		rx_ring->next_to_use = i;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4285
		if (unlikely(i-- == 0))
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4286
			i = (rx_ring->count - 1);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4287
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4288
		/* Force memory writes to complete before letting h/w
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4289
		 * know there are new descriptors to fetch.  (Only
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4290
		 * applicable for weak-ordered memory model archs,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4291
		 * such as IA-64). */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4292
		wmb();
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4293
		writel(i, adapter->hw.hw_addr + rx_ring->rdt);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4294
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4295
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4296
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4297
/**
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4298
 * e1000_alloc_rx_buffers - Replace used receive buffers; legacy & extended
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4299
 * @adapter: address of board private structure
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4300
 **/
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4301
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4302
static void e1000_alloc_rx_buffers(struct e1000_adapter *adapter,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4303
				   struct e1000_rx_ring *rx_ring,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4304
				   int cleaned_count)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4305
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4306
	struct e1000_hw *hw = &adapter->hw;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4307
	struct net_device *netdev = adapter->netdev;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4308
	struct pci_dev *pdev = adapter->pdev;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4309
	struct e1000_rx_desc *rx_desc;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4310
	struct e1000_buffer *buffer_info;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4311
	struct sk_buff *skb;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4312
	unsigned int i;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4313
	unsigned int bufsz = adapter->rx_buffer_len;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4314
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4315
	i = rx_ring->next_to_use;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4316
	buffer_info = &rx_ring->buffer_info[i];
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4317
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4318
	while (cleaned_count--) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4319
		skb = buffer_info->skb;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4320
		if (skb) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4321
			skb_trim(skb, 0);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4322
			goto map_skb;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4323
		}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4324
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4325
		skb = netdev_alloc_skb_ip_align(netdev, bufsz);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4326
		if (unlikely(!skb)) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4327
			/* Better luck next round */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4328
			adapter->alloc_rx_buff_failed++;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4329
			break;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4330
		}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4331
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4332
		/* Fix for errata 23, can't cross 64kB boundary */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4333
		if (!e1000_check_64k_bound(adapter, skb->data, bufsz)) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4334
			struct sk_buff *oldskb = skb;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4335
			e_err(rx_err, "skb align check failed: %u bytes at "
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4336
			      "%p\n", bufsz, skb->data);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4337
			/* Try again, without freeing the previous */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4338
			skb = netdev_alloc_skb_ip_align(netdev, bufsz);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4339
			/* Failed allocation, critical failure */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4340
			if (!skb) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4341
				dev_kfree_skb(oldskb);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4342
				adapter->alloc_rx_buff_failed++;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4343
				break;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4344
			}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4345
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4346
			if (!e1000_check_64k_bound(adapter, skb->data, bufsz)) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4347
				/* give up */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4348
				dev_kfree_skb(skb);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4349
				dev_kfree_skb(oldskb);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4350
				adapter->alloc_rx_buff_failed++;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4351
				break; /* while !buffer_info->skb */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4352
			}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4353
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4354
			/* Use new allocation */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4355
			dev_kfree_skb(oldskb);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4356
		}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4357
		buffer_info->skb = skb;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4358
		buffer_info->length = adapter->rx_buffer_len;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4359
map_skb:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4360
		buffer_info->dma = dma_map_single(&pdev->dev,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4361
						  skb->data,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4362
						  buffer_info->length,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4363
						  DMA_FROM_DEVICE);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4364
		if (dma_mapping_error(&pdev->dev, buffer_info->dma)) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4365
			dev_kfree_skb(skb);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4366
			buffer_info->skb = NULL;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4367
			buffer_info->dma = 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4368
			adapter->alloc_rx_buff_failed++;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4369
			break; /* while !buffer_info->skb */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4370
		}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4371
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4372
		/*
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4373
		 * XXX if it was allocated cleanly it will never map to a
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4374
		 * boundary crossing
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4375
		 */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4376
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4377
		/* Fix for errata 23, can't cross 64kB boundary */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4378
		if (!e1000_check_64k_bound(adapter,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4379
					(void *)(unsigned long)buffer_info->dma,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4380
					adapter->rx_buffer_len)) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4381
			e_err(rx_err, "dma align check failed: %u bytes at "
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4382
			      "%p\n", adapter->rx_buffer_len,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4383
			      (void *)(unsigned long)buffer_info->dma);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4384
			dev_kfree_skb(skb);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4385
			buffer_info->skb = NULL;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4386
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4387
			dma_unmap_single(&pdev->dev, buffer_info->dma,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4388
					 adapter->rx_buffer_len,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4389
					 DMA_FROM_DEVICE);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4390
			buffer_info->dma = 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4391
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4392
			adapter->alloc_rx_buff_failed++;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4393
			break; /* while !buffer_info->skb */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4394
		}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4395
		rx_desc = E1000_RX_DESC(*rx_ring, i);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4396
		rx_desc->buffer_addr = cpu_to_le64(buffer_info->dma);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4397
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4398
		if (unlikely(++i == rx_ring->count))
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4399
			i = 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4400
		buffer_info = &rx_ring->buffer_info[i];
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4401
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4402
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4403
	if (likely(rx_ring->next_to_use != i)) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4404
		rx_ring->next_to_use = i;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4405
		if (unlikely(i-- == 0))
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4406
			i = (rx_ring->count - 1);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4407
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4408
		/* Force memory writes to complete before letting h/w
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4409
		 * know there are new descriptors to fetch.  (Only
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4410
		 * applicable for weak-ordered memory model archs,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4411
		 * such as IA-64). */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4412
		wmb();
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4413
		writel(i, hw->hw_addr + rx_ring->rdt);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4414
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4415
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4416
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4417
/**
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4418
 * e1000_smartspeed - Workaround for SmartSpeed on 82541 and 82547 controllers.
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4419
 * @adapter:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4420
 **/
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4421
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4422
static void e1000_smartspeed(struct e1000_adapter *adapter)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4423
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4424
	struct e1000_hw *hw = &adapter->hw;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4425
	u16 phy_status;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4426
	u16 phy_ctrl;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4427
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4428
	if ((hw->phy_type != e1000_phy_igp) || !hw->autoneg ||
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4429
	   !(hw->autoneg_advertised & ADVERTISE_1000_FULL))
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4430
		return;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4431
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4432
	if (adapter->smartspeed == 0) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4433
		/* If Master/Slave config fault is asserted twice,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4434
		 * we assume back-to-back */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4435
		e1000_read_phy_reg(hw, PHY_1000T_STATUS, &phy_status);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4436
		if (!(phy_status & SR_1000T_MS_CONFIG_FAULT)) return;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4437
		e1000_read_phy_reg(hw, PHY_1000T_STATUS, &phy_status);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4438
		if (!(phy_status & SR_1000T_MS_CONFIG_FAULT)) return;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4439
		e1000_read_phy_reg(hw, PHY_1000T_CTRL, &phy_ctrl);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4440
		if (phy_ctrl & CR_1000T_MS_ENABLE) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4441
			phy_ctrl &= ~CR_1000T_MS_ENABLE;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4442
			e1000_write_phy_reg(hw, PHY_1000T_CTRL,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4443
					    phy_ctrl);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4444
			adapter->smartspeed++;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4445
			if (!e1000_phy_setup_autoneg(hw) &&
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4446
			   !e1000_read_phy_reg(hw, PHY_CTRL,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4447
				   	       &phy_ctrl)) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4448
				phy_ctrl |= (MII_CR_AUTO_NEG_EN |
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4449
					     MII_CR_RESTART_AUTO_NEG);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4450
				e1000_write_phy_reg(hw, PHY_CTRL,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4451
						    phy_ctrl);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4452
			}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4453
		}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4454
		return;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4455
	} else if (adapter->smartspeed == E1000_SMARTSPEED_DOWNSHIFT) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4456
		/* If still no link, perhaps using 2/3 pair cable */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4457
		e1000_read_phy_reg(hw, PHY_1000T_CTRL, &phy_ctrl);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4458
		phy_ctrl |= CR_1000T_MS_ENABLE;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4459
		e1000_write_phy_reg(hw, PHY_1000T_CTRL, phy_ctrl);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4460
		if (!e1000_phy_setup_autoneg(hw) &&
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4461
		   !e1000_read_phy_reg(hw, PHY_CTRL, &phy_ctrl)) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4462
			phy_ctrl |= (MII_CR_AUTO_NEG_EN |
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4463
				     MII_CR_RESTART_AUTO_NEG);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4464
			e1000_write_phy_reg(hw, PHY_CTRL, phy_ctrl);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4465
		}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4466
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4467
	/* Restart process after E1000_SMARTSPEED_MAX iterations */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4468
	if (adapter->smartspeed++ == E1000_SMARTSPEED_MAX)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4469
		adapter->smartspeed = 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4470
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4471
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4472
/**
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4473
 * e1000_ioctl -
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4474
 * @netdev:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4475
 * @ifreq:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4476
 * @cmd:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4477
 **/
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4478
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4479
static int e1000_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4480
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4481
	switch (cmd) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4482
	case SIOCGMIIPHY:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4483
	case SIOCGMIIREG:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4484
	case SIOCSMIIREG:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4485
		return e1000_mii_ioctl(netdev, ifr, cmd);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4486
	default:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4487
		return -EOPNOTSUPP;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4488
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4489
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4490
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4491
/**
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4492
 * e1000_mii_ioctl -
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4493
 * @netdev:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4494
 * @ifreq:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4495
 * @cmd:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4496
 **/
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4497
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4498
static int e1000_mii_ioctl(struct net_device *netdev, struct ifreq *ifr,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4499
			   int cmd)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4500
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4501
	struct e1000_adapter *adapter = netdev_priv(netdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4502
	struct e1000_hw *hw = &adapter->hw;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4503
	struct mii_ioctl_data *data = if_mii(ifr);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4504
	int retval;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4505
	u16 mii_reg;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4506
	u16 spddplx;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4507
	unsigned long flags;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4508
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4509
	if (hw->media_type != e1000_media_type_copper)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4510
		return -EOPNOTSUPP;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4511
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4512
	switch (cmd) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4513
	case SIOCGMIIPHY:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4514
		data->phy_id = hw->phy_addr;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4515
		break;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4516
	case SIOCGMIIREG:
2284
08edb009bee8 Minor: Indentation and braces.
Florian Pose <fp@igh-essen.com>
parents: 2238
diff changeset
  4517
		if (adapter->ecdev) {
08edb009bee8 Minor: Indentation and braces.
Florian Pose <fp@igh-essen.com>
parents: 2238
diff changeset
  4518
			return -EPERM;
08edb009bee8 Minor: Indentation and braces.
Florian Pose <fp@igh-essen.com>
parents: 2238
diff changeset
  4519
		}
2173
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4520
		spin_lock_irqsave(&adapter->stats_lock, flags);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4521
		if (e1000_read_phy_reg(hw, data->reg_num & 0x1F,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4522
				   &data->val_out)) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4523
			spin_unlock_irqrestore(&adapter->stats_lock, flags);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4524
			return -EIO;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4525
		}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4526
		spin_unlock_irqrestore(&adapter->stats_lock, flags);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4527
		break;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4528
	case SIOCSMIIREG:
2284
08edb009bee8 Minor: Indentation and braces.
Florian Pose <fp@igh-essen.com>
parents: 2238
diff changeset
  4529
		if (adapter->ecdev) {
08edb009bee8 Minor: Indentation and braces.
Florian Pose <fp@igh-essen.com>
parents: 2238
diff changeset
  4530
			return -EPERM;
08edb009bee8 Minor: Indentation and braces.
Florian Pose <fp@igh-essen.com>
parents: 2238
diff changeset
  4531
		}
2173
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4532
		if (data->reg_num & ~(0x1F))
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4533
			return -EFAULT;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4534
		mii_reg = data->val_in;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4535
		spin_lock_irqsave(&adapter->stats_lock, flags);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4536
		if (e1000_write_phy_reg(hw, data->reg_num,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4537
					mii_reg)) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4538
			spin_unlock_irqrestore(&adapter->stats_lock, flags);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4539
			return -EIO;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4540
		}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4541
		spin_unlock_irqrestore(&adapter->stats_lock, flags);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4542
		if (hw->media_type == e1000_media_type_copper) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4543
			switch (data->reg_num) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4544
			case PHY_CTRL:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4545
				if (mii_reg & MII_CR_POWER_DOWN)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4546
					break;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4547
				if (mii_reg & MII_CR_AUTO_NEG_EN) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4548
					hw->autoneg = 1;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4549
					hw->autoneg_advertised = 0x2F;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4550
				} else {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4551
					if (mii_reg & 0x40)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4552
						spddplx = SPEED_1000;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4553
					else if (mii_reg & 0x2000)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4554
						spddplx = SPEED_100;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4555
					else
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4556
						spddplx = SPEED_10;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4557
					spddplx += (mii_reg & 0x100)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4558
						   ? DUPLEX_FULL :
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4559
						   DUPLEX_HALF;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4560
					retval = e1000_set_spd_dplx(adapter,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4561
								    spddplx);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4562
					if (retval)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4563
						return retval;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4564
				}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4565
				if (netif_running(adapter->netdev))
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4566
					e1000_reinit_locked(adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4567
				else
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4568
					e1000_reset(adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4569
				break;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4570
			case M88E1000_PHY_SPEC_CTRL:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4571
			case M88E1000_EXT_PHY_SPEC_CTRL:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4572
				if (e1000_phy_reset(hw))
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4573
					return -EIO;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4574
				break;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4575
			}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4576
		} else {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4577
			switch (data->reg_num) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4578
			case PHY_CTRL:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4579
				if (mii_reg & MII_CR_POWER_DOWN)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4580
					break;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4581
				if (netif_running(adapter->netdev))
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4582
					e1000_reinit_locked(adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4583
				else
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4584
					e1000_reset(adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4585
				break;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4586
			}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4587
		}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4588
		break;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4589
	default:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4590
		return -EOPNOTSUPP;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4591
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4592
	return E1000_SUCCESS;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4593
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4594
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4595
void e1000_pci_set_mwi(struct e1000_hw *hw)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4596
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4597
	struct e1000_adapter *adapter = hw->back;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4598
	int ret_val = pci_set_mwi(adapter->pdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4599
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4600
	if (ret_val)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4601
		e_err(probe, "Error in setting MWI\n");
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4602
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4603
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4604
void e1000_pci_clear_mwi(struct e1000_hw *hw)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4605
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4606
	struct e1000_adapter *adapter = hw->back;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4607
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4608
	pci_clear_mwi(adapter->pdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4609
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4610
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4611
int e1000_pcix_get_mmrbc(struct e1000_hw *hw)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4612
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4613
	struct e1000_adapter *adapter = hw->back;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4614
	return pcix_get_mmrbc(adapter->pdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4615
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4616
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4617
void e1000_pcix_set_mmrbc(struct e1000_hw *hw, int mmrbc)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4618
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4619
	struct e1000_adapter *adapter = hw->back;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4620
	pcix_set_mmrbc(adapter->pdev, mmrbc);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4621
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4622
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4623
void e1000_io_write(struct e1000_hw *hw, unsigned long port, u32 value)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4624
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4625
	outl(value, port);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4626
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4627
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4628
static void e1000_vlan_rx_register(struct net_device *netdev,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4629
				   struct vlan_group *grp)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4630
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4631
	struct e1000_adapter *adapter = netdev_priv(netdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4632
	struct e1000_hw *hw = &adapter->hw;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4633
	u32 ctrl, rctl;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4634
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4635
	if (!test_bit(__E1000_DOWN, &adapter->flags))
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4636
		e1000_irq_disable(adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4637
	adapter->vlgrp = grp;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4638
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4639
	if (grp) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4640
		/* enable VLAN tag insert/strip */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4641
		ctrl = er32(CTRL);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4642
		ctrl |= E1000_CTRL_VME;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4643
		ew32(CTRL, ctrl);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4644
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4645
		/* enable VLAN receive filtering */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4646
		rctl = er32(RCTL);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4647
		rctl &= ~E1000_RCTL_CFIEN;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4648
		if (!(netdev->flags & IFF_PROMISC))
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4649
			rctl |= E1000_RCTL_VFE;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4650
		ew32(RCTL, rctl);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4651
		e1000_update_mng_vlan(adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4652
	} else {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4653
		/* disable VLAN tag insert/strip */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4654
		ctrl = er32(CTRL);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4655
		ctrl &= ~E1000_CTRL_VME;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4656
		ew32(CTRL, ctrl);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4657
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4658
		/* disable VLAN receive filtering */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4659
		rctl = er32(RCTL);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4660
		rctl &= ~E1000_RCTL_VFE;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4661
		ew32(RCTL, rctl);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4662
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4663
		if (adapter->mng_vlan_id != (u16)E1000_MNG_VLAN_NONE) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4664
			e1000_vlan_rx_kill_vid(netdev, adapter->mng_vlan_id);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4665
			adapter->mng_vlan_id = E1000_MNG_VLAN_NONE;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4666
		}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4667
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4668
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4669
	if (!test_bit(__E1000_DOWN, &adapter->flags))
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4670
		e1000_irq_enable(adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4671
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4672
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4673
static void e1000_vlan_rx_add_vid(struct net_device *netdev, u16 vid)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4674
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4675
	struct e1000_adapter *adapter = netdev_priv(netdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4676
	struct e1000_hw *hw = &adapter->hw;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4677
	u32 vfta, index;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4678
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4679
	if ((hw->mng_cookie.status &
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4680
	     E1000_MNG_DHCP_COOKIE_STATUS_VLAN_SUPPORT) &&
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4681
	    (vid == adapter->mng_vlan_id))
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4682
		return;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4683
	/* add VID to filter table */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4684
	index = (vid >> 5) & 0x7F;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4685
	vfta = E1000_READ_REG_ARRAY(hw, VFTA, index);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4686
	vfta |= (1 << (vid & 0x1F));
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4687
	e1000_write_vfta(hw, index, vfta);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4688
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4689
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4690
static void e1000_vlan_rx_kill_vid(struct net_device *netdev, u16 vid)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4691
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4692
	struct e1000_adapter *adapter = netdev_priv(netdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4693
	struct e1000_hw *hw = &adapter->hw;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4694
	u32 vfta, index;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4695
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4696
	if (!test_bit(__E1000_DOWN, &adapter->flags))
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4697
		e1000_irq_disable(adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4698
	vlan_group_set_device(adapter->vlgrp, vid, NULL);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4699
	if (!test_bit(__E1000_DOWN, &adapter->flags))
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4700
		e1000_irq_enable(adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4701
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4702
	/* remove VID from filter table */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4703
	index = (vid >> 5) & 0x7F;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4704
	vfta = E1000_READ_REG_ARRAY(hw, VFTA, index);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4705
	vfta &= ~(1 << (vid & 0x1F));
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4706
	e1000_write_vfta(hw, index, vfta);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4707
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4708
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4709
static void e1000_restore_vlan(struct e1000_adapter *adapter)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4710
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4711
	e1000_vlan_rx_register(adapter->netdev, adapter->vlgrp);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4712
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4713
	if (adapter->vlgrp) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4714
		u16 vid;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4715
		for (vid = 0; vid < VLAN_N_VID; vid++) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4716
			if (!vlan_group_get_device(adapter->vlgrp, vid))
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4717
				continue;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4718
			e1000_vlan_rx_add_vid(adapter->netdev, vid);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4719
		}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4720
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4721
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4722
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4723
int e1000_set_spd_dplx(struct e1000_adapter *adapter, u16 spddplx)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4724
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4725
	struct e1000_hw *hw = &adapter->hw;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4726
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4727
	hw->autoneg = 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4728
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4729
	/* Fiber NICs only allow 1000 gbps Full duplex */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4730
	if ((hw->media_type == e1000_media_type_fiber) &&
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4731
		spddplx != (SPEED_1000 + DUPLEX_FULL)) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4732
		e_err(probe, "Unsupported Speed/Duplex configuration\n");
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4733
		return -EINVAL;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4734
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4735
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4736
	switch (spddplx) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4737
	case SPEED_10 + DUPLEX_HALF:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4738
		hw->forced_speed_duplex = e1000_10_half;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4739
		break;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4740
	case SPEED_10 + DUPLEX_FULL:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4741
		hw->forced_speed_duplex = e1000_10_full;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4742
		break;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4743
	case SPEED_100 + DUPLEX_HALF:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4744
		hw->forced_speed_duplex = e1000_100_half;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4745
		break;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4746
	case SPEED_100 + DUPLEX_FULL:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4747
		hw->forced_speed_duplex = e1000_100_full;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4748
		break;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4749
	case SPEED_1000 + DUPLEX_FULL:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4750
		hw->autoneg = 1;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4751
		hw->autoneg_advertised = ADVERTISE_1000_FULL;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4752
		break;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4753
	case SPEED_1000 + DUPLEX_HALF: /* not supported */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4754
	default:
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4755
		e_err(probe, "Unsupported Speed/Duplex configuration\n");
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4756
		return -EINVAL;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4757
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4758
	return 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4759
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4760
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4761
static int __e1000_shutdown(struct pci_dev *pdev, bool *enable_wake)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4762
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4763
	struct net_device *netdev = pci_get_drvdata(pdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4764
	struct e1000_adapter *adapter = netdev_priv(netdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4765
	struct e1000_hw *hw = &adapter->hw;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4766
	u32 ctrl, ctrl_ext, rctl, status;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4767
	u32 wufc = adapter->wol;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4768
#ifdef CONFIG_PM
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4769
	int retval = 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4770
#endif
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4771
2284
08edb009bee8 Minor: Indentation and braces.
Florian Pose <fp@igh-essen.com>
parents: 2238
diff changeset
  4772
	if (adapter->ecdev) {
2173
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4773
		return -EBUSY;
2284
08edb009bee8 Minor: Indentation and braces.
Florian Pose <fp@igh-essen.com>
parents: 2238
diff changeset
  4774
	}
2173
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4775
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4776
	netif_device_detach(netdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4777
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4778
	if (netif_running(netdev)) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4779
		WARN_ON(test_bit(__E1000_RESETTING, &adapter->flags));
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4780
		e1000_down(adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4781
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4782
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4783
#ifdef CONFIG_PM
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4784
	retval = pci_save_state(pdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4785
	if (retval)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4786
		return retval;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4787
#endif
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4788
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4789
	status = er32(STATUS);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4790
	if (status & E1000_STATUS_LU)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4791
		wufc &= ~E1000_WUFC_LNKC;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4792
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4793
	if (wufc) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4794
		e1000_setup_rctl(adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4795
		e1000_set_rx_mode(netdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4796
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4797
		/* turn on all-multi mode if wake on multicast is enabled */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4798
		if (wufc & E1000_WUFC_MC) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4799
			rctl = er32(RCTL);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4800
			rctl |= E1000_RCTL_MPE;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4801
			ew32(RCTL, rctl);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4802
		}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4803
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4804
		if (hw->mac_type >= e1000_82540) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4805
			ctrl = er32(CTRL);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4806
			/* advertise wake from D3Cold */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4807
			#define E1000_CTRL_ADVD3WUC 0x00100000
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4808
			/* phy power management enable */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4809
			#define E1000_CTRL_EN_PHY_PWR_MGMT 0x00200000
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4810
			ctrl |= E1000_CTRL_ADVD3WUC |
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4811
				E1000_CTRL_EN_PHY_PWR_MGMT;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4812
			ew32(CTRL, ctrl);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4813
		}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4814
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4815
		if (hw->media_type == e1000_media_type_fiber ||
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4816
		    hw->media_type == e1000_media_type_internal_serdes) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4817
			/* keep the laser running in D3 */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4818
			ctrl_ext = er32(CTRL_EXT);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4819
			ctrl_ext |= E1000_CTRL_EXT_SDP7_DATA;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4820
			ew32(CTRL_EXT, ctrl_ext);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4821
		}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4822
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4823
		ew32(WUC, E1000_WUC_PME_EN);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4824
		ew32(WUFC, wufc);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4825
	} else {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4826
		ew32(WUC, 0);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4827
		ew32(WUFC, 0);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4828
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4829
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4830
	e1000_release_manageability(adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4831
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4832
	*enable_wake = !!wufc;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4833
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4834
	/* make sure adapter isn't asleep if manageability is enabled */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4835
	if (adapter->en_mng_pt)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4836
		*enable_wake = true;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4837
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4838
	if (netif_running(netdev))
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4839
		e1000_free_irq(adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4840
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4841
	pci_disable_device(pdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4842
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4843
	return 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4844
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4845
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4846
#ifdef CONFIG_PM
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4847
static int e1000_suspend(struct pci_dev *pdev, pm_message_t state)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4848
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4849
	int retval;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4850
	bool wake;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4851
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4852
	retval = __e1000_shutdown(pdev, &wake);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4853
	if (retval)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4854
		return retval;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4855
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4856
	if (wake) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4857
		pci_prepare_to_sleep(pdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4858
	} else {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4859
		pci_wake_from_d3(pdev, false);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4860
		pci_set_power_state(pdev, PCI_D3hot);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4861
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4862
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4863
	return 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4864
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4865
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4866
static int e1000_resume(struct pci_dev *pdev)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4867
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4868
	struct net_device *netdev = pci_get_drvdata(pdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4869
	struct e1000_adapter *adapter = netdev_priv(netdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4870
	struct e1000_hw *hw = &adapter->hw;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4871
	u32 err;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4872
2284
08edb009bee8 Minor: Indentation and braces.
Florian Pose <fp@igh-essen.com>
parents: 2238
diff changeset
  4873
	if (adapter->ecdev) {
2173
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4874
		return -EBUSY;
2284
08edb009bee8 Minor: Indentation and braces.
Florian Pose <fp@igh-essen.com>
parents: 2238
diff changeset
  4875
	}
2173
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4876
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4877
	pci_set_power_state(pdev, PCI_D0);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4878
	pci_restore_state(pdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4879
	pci_save_state(pdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4880
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4881
	if (adapter->need_ioport)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4882
		err = pci_enable_device(pdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4883
	else
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4884
		err = pci_enable_device_mem(pdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4885
	if (err) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4886
		pr_err("Cannot enable PCI device from suspend\n");
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4887
		return err;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4888
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4889
	pci_set_master(pdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4890
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4891
	pci_enable_wake(pdev, PCI_D3hot, 0);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4892
	pci_enable_wake(pdev, PCI_D3cold, 0);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4893
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4894
	if (netif_running(netdev)) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4895
		err = e1000_request_irq(adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4896
		if (err)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4897
			return err;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4898
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4899
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4900
	e1000_power_up_phy(adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4901
	e1000_reset(adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4902
	ew32(WUS, ~0);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4903
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4904
	e1000_init_manageability(adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4905
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4906
	if (netif_running(netdev))
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4907
		e1000_up(adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4908
2284
08edb009bee8 Minor: Indentation and braces.
Florian Pose <fp@igh-essen.com>
parents: 2238
diff changeset
  4909
	if (!adapter->ecdev) {
08edb009bee8 Minor: Indentation and braces.
Florian Pose <fp@igh-essen.com>
parents: 2238
diff changeset
  4910
		netif_device_attach(netdev);
08edb009bee8 Minor: Indentation and braces.
Florian Pose <fp@igh-essen.com>
parents: 2238
diff changeset
  4911
	}
2173
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4912
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4913
	return 0;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4914
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4915
#endif
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4916
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4917
static void e1000_shutdown(struct pci_dev *pdev)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4918
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4919
	bool wake;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4920
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4921
	__e1000_shutdown(pdev, &wake);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4922
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4923
	if (system_state == SYSTEM_POWER_OFF) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4924
		pci_wake_from_d3(pdev, wake);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4925
		pci_set_power_state(pdev, PCI_D3hot);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4926
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4927
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4928
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4929
#ifdef CONFIG_NET_POLL_CONTROLLER
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4930
/*
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4931
 * Polling 'interrupt' - used by things like netconsole to send skbs
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4932
 * without having to re-enable interrupts. It's not called while
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4933
 * the interrupt routine is executing.
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4934
 */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4935
static void e1000_netpoll(struct net_device *netdev)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4936
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4937
	struct e1000_adapter *adapter = netdev_priv(netdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4938
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4939
	disable_irq(adapter->pdev->irq);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4940
	e1000_intr(adapter->pdev->irq, netdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4941
	enable_irq(adapter->pdev->irq);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4942
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4943
#endif
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4944
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4945
/**
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4946
 * e1000_io_error_detected - called when PCI error is detected
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4947
 * @pdev: Pointer to PCI device
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4948
 * @state: The current pci connection state
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4949
 *
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4950
 * This function is called after a PCI bus error affecting
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4951
 * this device has been detected.
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4952
 */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4953
static pci_ers_result_t e1000_io_error_detected(struct pci_dev *pdev,
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4954
						pci_channel_state_t state)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4955
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4956
	struct net_device *netdev = pci_get_drvdata(pdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4957
	struct e1000_adapter *adapter = netdev_priv(netdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4958
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4959
	netif_device_detach(netdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4960
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4961
	if (state == pci_channel_io_perm_failure)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4962
		return PCI_ERS_RESULT_DISCONNECT;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4963
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4964
	if (netif_running(netdev))
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4965
		e1000_down(adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4966
	pci_disable_device(pdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4967
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4968
	/* Request a slot slot reset. */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4969
	return PCI_ERS_RESULT_NEED_RESET;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4970
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4971
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4972
/**
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4973
 * e1000_io_slot_reset - called after the pci bus has been reset.
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4974
 * @pdev: Pointer to PCI device
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4975
 *
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4976
 * Restart the card from scratch, as if from a cold-boot. Implementation
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4977
 * resembles the first-half of the e1000_resume routine.
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4978
 */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4979
static pci_ers_result_t e1000_io_slot_reset(struct pci_dev *pdev)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4980
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4981
	struct net_device *netdev = pci_get_drvdata(pdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4982
	struct e1000_adapter *adapter = netdev_priv(netdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4983
	struct e1000_hw *hw = &adapter->hw;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4984
	int err;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4985
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4986
	if (adapter->need_ioport)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4987
		err = pci_enable_device(pdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4988
	else
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4989
		err = pci_enable_device_mem(pdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4990
	if (err) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4991
		pr_err("Cannot re-enable PCI device after reset.\n");
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4992
		return PCI_ERS_RESULT_DISCONNECT;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4993
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4994
	pci_set_master(pdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4995
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4996
	pci_enable_wake(pdev, PCI_D3hot, 0);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4997
	pci_enable_wake(pdev, PCI_D3cold, 0);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4998
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4999
	e1000_reset(adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5000
	ew32(WUS, ~0);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5001
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5002
	return PCI_ERS_RESULT_RECOVERED;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5003
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5004
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5005
/**
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5006
 * e1000_io_resume - called when traffic can start flowing again.
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5007
 * @pdev: Pointer to PCI device
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5008
 *
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5009
 * This callback is called when the error recovery driver tells us that
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5010
 * its OK to resume normal operation. Implementation resembles the
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5011
 * second-half of the e1000_resume routine.
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5012
 */
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5013
static void e1000_io_resume(struct pci_dev *pdev)
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5014
{
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5015
	struct net_device *netdev = pci_get_drvdata(pdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5016
	struct e1000_adapter *adapter = netdev_priv(netdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5017
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5018
	e1000_init_manageability(adapter);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5019
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5020
	if (netif_running(netdev)) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5021
		if (e1000_up(adapter)) {
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5022
			pr_info("can't bring device back up after reset\n");
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5023
			return;
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5024
		}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5025
	}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5026
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5027
	netif_device_attach(netdev);
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5028
}
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5029
312ab8ed8284 Added e1000 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5030
/* e1000_main.c */