devices/e1000/e1000_main-2.6.31-ethercat.c
author Knud Baastrup <kba@deif.com>
Tue, 14 Apr 2015 13:12:24 -0400
changeset 2629 a2701af27fde
parent 2589 2b9c78543663
permissions -rw-r--r--
Internal SDO requests now synchronized with external requests.
Internal SDO requests are managed by master FSM and can conflict with
external requests managed by slave FSM. The internal SDO requests
includes SDO requests created by an application and external request are
typical created by EtherCAT Tool for SDO upload/download or a directory
fetch initiated with ethercat sdos command. The conflict will cause a
FPWR from an external request to be overwritten by a FPWR from an
internal SDO request (or oppersite) in the same "train" of datagrams.
1996
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
     1
/*******************************************************************************
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
     2
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
     3
  Intel PRO/1000 Linux driver
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
     4
  Copyright(c) 1999 - 2006 Intel Corporation.
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
     5
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
     6
  This program is free software; you can redistribute it and/or modify it
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
     7
  under the terms and conditions of the GNU General Public License,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
     8
  version 2, as published by the Free Software Foundation.
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
     9
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    10
  This program is distributed in the hope it will be useful, but WITHOUT
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    11
  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    12
  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    13
  more details.
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    14
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    15
  You should have received a copy of the GNU General Public License along with
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    16
  this program; if not, write to the Free Software Foundation, Inc.,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    17
  51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    18
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    19
  The full GNU General Public License is included in this distribution in
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    20
  the file called "COPYING".
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    21
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    22
  Contact Information:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    23
  Linux NICS <linux.nics@intel.com>
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    24
  e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    25
  Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    26
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    27
  vim: noexpandtab
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    28
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    29
*******************************************************************************/
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    30
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    31
#include "e1000-2.6.31-ethercat.h"
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    32
#include <net/ip6_checksum.h>
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    33
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    34
char e1000_driver_name[] = "ec_e1000";
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    35
static char e1000_driver_string[] = "Intel(R) PRO/1000 Network Driver";
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    36
#define DRV_VERSION "7.3.21-k3-NAPI"
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    37
const char e1000_driver_version[] = DRV_VERSION;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    38
static const char e1000_copyright[] = "Copyright (c) 1999-2006 Intel Corporation.";
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    39
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    40
/* e1000_pci_tbl - PCI Device ID Table
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    41
 *
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    42
 * Last entry must be all 0s
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    43
 *
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    44
 * Macro expands to...
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    45
 *   {PCI_DEVICE(PCI_VENDOR_ID_INTEL, device_id)}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    46
 */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    47
static struct pci_device_id e1000_pci_tbl[] = {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    48
	INTEL_E1000_ETHERNET_DEVICE(0x1000),
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    49
	INTEL_E1000_ETHERNET_DEVICE(0x1001),
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    50
	INTEL_E1000_ETHERNET_DEVICE(0x1004),
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    51
	INTEL_E1000_ETHERNET_DEVICE(0x1008),
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    52
	INTEL_E1000_ETHERNET_DEVICE(0x1009),
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    53
	INTEL_E1000_ETHERNET_DEVICE(0x100C),
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    54
	INTEL_E1000_ETHERNET_DEVICE(0x100D),
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    55
	INTEL_E1000_ETHERNET_DEVICE(0x100E),
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    56
	INTEL_E1000_ETHERNET_DEVICE(0x100F),
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    57
	INTEL_E1000_ETHERNET_DEVICE(0x1010),
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    58
	INTEL_E1000_ETHERNET_DEVICE(0x1011),
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    59
	INTEL_E1000_ETHERNET_DEVICE(0x1012),
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    60
	INTEL_E1000_ETHERNET_DEVICE(0x1013),
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    61
	INTEL_E1000_ETHERNET_DEVICE(0x1014),
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    62
	INTEL_E1000_ETHERNET_DEVICE(0x1015),
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    63
	INTEL_E1000_ETHERNET_DEVICE(0x1016),
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    64
	INTEL_E1000_ETHERNET_DEVICE(0x1017),
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    65
	INTEL_E1000_ETHERNET_DEVICE(0x1018),
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    66
	INTEL_E1000_ETHERNET_DEVICE(0x1019),
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    67
	INTEL_E1000_ETHERNET_DEVICE(0x101A),
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    68
	INTEL_E1000_ETHERNET_DEVICE(0x101D),
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    69
	INTEL_E1000_ETHERNET_DEVICE(0x101E),
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    70
	INTEL_E1000_ETHERNET_DEVICE(0x1026),
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    71
	INTEL_E1000_ETHERNET_DEVICE(0x1027),
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    72
	INTEL_E1000_ETHERNET_DEVICE(0x1028),
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    73
	INTEL_E1000_ETHERNET_DEVICE(0x1075),
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    74
	INTEL_E1000_ETHERNET_DEVICE(0x1076),
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    75
	INTEL_E1000_ETHERNET_DEVICE(0x1077),
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    76
	INTEL_E1000_ETHERNET_DEVICE(0x1078),
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    77
	INTEL_E1000_ETHERNET_DEVICE(0x1079),
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    78
	INTEL_E1000_ETHERNET_DEVICE(0x107A),
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    79
	INTEL_E1000_ETHERNET_DEVICE(0x107B),
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    80
	INTEL_E1000_ETHERNET_DEVICE(0x107C),
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    81
	INTEL_E1000_ETHERNET_DEVICE(0x108A),
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    82
	INTEL_E1000_ETHERNET_DEVICE(0x1099),
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    83
	INTEL_E1000_ETHERNET_DEVICE(0x10B5),
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    84
	/* required last entry */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    85
	{0,}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    86
};
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    87
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    88
// do not auto-load driver
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    89
// MODULE_DEVICE_TABLE(pci, e1000_pci_tbl);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    90
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    91
int e1000_up(struct e1000_adapter *adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    92
void e1000_down(struct e1000_adapter *adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    93
void e1000_reinit_locked(struct e1000_adapter *adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    94
void e1000_reset(struct e1000_adapter *adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    95
int e1000_set_spd_dplx(struct e1000_adapter *adapter, u16 spddplx);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    96
int e1000_setup_all_tx_resources(struct e1000_adapter *adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    97
int e1000_setup_all_rx_resources(struct e1000_adapter *adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    98
void e1000_free_all_tx_resources(struct e1000_adapter *adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    99
void e1000_free_all_rx_resources(struct e1000_adapter *adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   100
static int e1000_setup_tx_resources(struct e1000_adapter *adapter,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   101
                             struct e1000_tx_ring *txdr);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   102
static int e1000_setup_rx_resources(struct e1000_adapter *adapter,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   103
                             struct e1000_rx_ring *rxdr);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   104
static void e1000_free_tx_resources(struct e1000_adapter *adapter,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   105
                             struct e1000_tx_ring *tx_ring);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   106
static void e1000_free_rx_resources(struct e1000_adapter *adapter,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   107
                             struct e1000_rx_ring *rx_ring);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   108
void e1000_update_stats(struct e1000_adapter *adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   109
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   110
static int e1000_init_module(void);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   111
static void e1000_exit_module(void);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   112
static int e1000_probe(struct pci_dev *pdev, const struct pci_device_id *ent);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   113
static void __devexit e1000_remove(struct pci_dev *pdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   114
static int e1000_alloc_queues(struct e1000_adapter *adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   115
static int e1000_sw_init(struct e1000_adapter *adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   116
static int e1000_open(struct net_device *netdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   117
static int e1000_close(struct net_device *netdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   118
static void e1000_configure_tx(struct e1000_adapter *adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   119
static void e1000_configure_rx(struct e1000_adapter *adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   120
static void e1000_setup_rctl(struct e1000_adapter *adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   121
static void e1000_clean_all_tx_rings(struct e1000_adapter *adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   122
static void e1000_clean_all_rx_rings(struct e1000_adapter *adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   123
static void e1000_clean_tx_ring(struct e1000_adapter *adapter,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   124
                                struct e1000_tx_ring *tx_ring);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   125
static void e1000_clean_rx_ring(struct e1000_adapter *adapter,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   126
                                struct e1000_rx_ring *rx_ring);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   127
static void e1000_set_rx_mode(struct net_device *netdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   128
static void e1000_update_phy_info(unsigned long data);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   129
static void e1000_watchdog(unsigned long data);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   130
static void e1000_82547_tx_fifo_stall(unsigned long data);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   131
static int e1000_xmit_frame(struct sk_buff *skb, struct net_device *netdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   132
static struct net_device_stats * e1000_get_stats(struct net_device *netdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   133
static int e1000_change_mtu(struct net_device *netdev, int new_mtu);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   134
static int e1000_set_mac(struct net_device *netdev, void *p);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   135
void ec_poll(struct net_device *);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   136
static irqreturn_t e1000_intr(int irq, void *data);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   137
static irqreturn_t e1000_intr_msi(int irq, void *data);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   138
static bool e1000_clean_tx_irq(struct e1000_adapter *adapter,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   139
			       struct e1000_tx_ring *tx_ring);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   140
static int e1000_clean(struct napi_struct *napi, int budget);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   141
static bool e1000_clean_rx_irq(struct e1000_adapter *adapter,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   142
			       struct e1000_rx_ring *rx_ring,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   143
			       int *work_done, int work_to_do);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   144
static void e1000_alloc_rx_buffers(struct e1000_adapter *adapter,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   145
                                   struct e1000_rx_ring *rx_ring,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   146
				   int cleaned_count);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   147
static int e1000_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   148
static int e1000_mii_ioctl(struct net_device *netdev, struct ifreq *ifr,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   149
			   int cmd);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   150
static void e1000_enter_82542_rst(struct e1000_adapter *adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   151
static void e1000_leave_82542_rst(struct e1000_adapter *adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   152
static void e1000_tx_timeout(struct net_device *dev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   153
static void e1000_reset_task(struct work_struct *work);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   154
static void e1000_smartspeed(struct e1000_adapter *adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   155
static int e1000_82547_fifo_workaround(struct e1000_adapter *adapter,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   156
                                       struct sk_buff *skb);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   157
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   158
static void e1000_vlan_rx_register(struct net_device *netdev, struct vlan_group *grp);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   159
static void e1000_vlan_rx_add_vid(struct net_device *netdev, u16 vid);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   160
static void e1000_vlan_rx_kill_vid(struct net_device *netdev, u16 vid);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   161
static void e1000_restore_vlan(struct e1000_adapter *adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   162
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   163
#ifdef CONFIG_PM
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   164
static int e1000_suspend(struct pci_dev *pdev, pm_message_t state);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   165
static int e1000_resume(struct pci_dev *pdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   166
#endif
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   167
static void e1000_shutdown(struct pci_dev *pdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   168
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   169
#ifdef CONFIG_NET_POLL_CONTROLLER
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   170
/* for netdump / net console */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   171
static void e1000_netpoll (struct net_device *netdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   172
#endif
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   173
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   174
#define COPYBREAK_DEFAULT 256
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   175
static unsigned int copybreak __read_mostly = COPYBREAK_DEFAULT;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   176
module_param(copybreak, uint, 0644);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   177
MODULE_PARM_DESC(copybreak,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   178
	"Maximum size of packet that is copied to a new buffer on receive");
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   179
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   180
static pci_ers_result_t e1000_io_error_detected(struct pci_dev *pdev,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   181
                     pci_channel_state_t state);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   182
static pci_ers_result_t e1000_io_slot_reset(struct pci_dev *pdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   183
static void e1000_io_resume(struct pci_dev *pdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   184
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   185
static struct pci_error_handlers e1000_err_handler = {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   186
	.error_detected = e1000_io_error_detected,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   187
	.slot_reset = e1000_io_slot_reset,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   188
	.resume = e1000_io_resume,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   189
};
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   190
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   191
static struct pci_driver e1000_driver = {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   192
	.name     = e1000_driver_name,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   193
	.id_table = e1000_pci_tbl,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   194
	.probe    = e1000_probe,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   195
	.remove   = __devexit_p(e1000_remove),
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   196
#ifdef CONFIG_PM
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   197
	/* Power Managment Hooks */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   198
	.suspend  = e1000_suspend,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   199
	.resume   = e1000_resume,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   200
#endif
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   201
	.shutdown = e1000_shutdown,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   202
	.err_handler = &e1000_err_handler
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   203
};
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   204
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   205
MODULE_AUTHOR("Florian Pose <fp@igh-essen.com>");
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   206
MODULE_DESCRIPTION("EtherCAT-capable Intel(R) PRO/1000 Network Driver");
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   207
MODULE_LICENSE("GPL");
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   208
MODULE_VERSION(DRV_VERSION);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   209
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   210
static int debug = NETIF_MSG_DRV | NETIF_MSG_PROBE;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   211
module_param(debug, int, 0);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   212
MODULE_PARM_DESC(debug, "Debug level (0=none,...,16=all)");
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   213
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   214
/**
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   215
 * e1000_init_module - Driver Registration Routine
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   216
 *
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   217
 * e1000_init_module is the first routine called when the driver is
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   218
 * loaded. All it does is register with the PCI subsystem.
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   219
 **/
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   220
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   221
static int __init e1000_init_module(void)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   222
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   223
	int ret;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   224
	printk(KERN_INFO "%s - version %s\n",
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   225
	       e1000_driver_string, e1000_driver_version);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   226
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   227
	printk(KERN_INFO "%s\n", e1000_copyright);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   228
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   229
	ret = pci_register_driver(&e1000_driver);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   230
	if (copybreak != COPYBREAK_DEFAULT) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   231
		if (copybreak == 0)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   232
			printk(KERN_INFO "e1000: copybreak disabled\n");
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   233
		else
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   234
			printk(KERN_INFO "e1000: copybreak enabled for "
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   235
			       "packets <= %u bytes\n", copybreak);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   236
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   237
	return ret;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   238
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   239
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   240
module_init(e1000_init_module);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   241
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   242
/**
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   243
 * e1000_exit_module - Driver Exit Cleanup Routine
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   244
 *
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   245
 * e1000_exit_module is called just before the driver is removed
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   246
 * from memory.
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   247
 **/
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   248
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   249
static void __exit e1000_exit_module(void)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   250
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   251
	pci_unregister_driver(&e1000_driver);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   252
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   253
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   254
module_exit(e1000_exit_module);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   255
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   256
static int e1000_request_irq(struct e1000_adapter *adapter)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   257
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   258
	struct e1000_hw *hw = &adapter->hw;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   259
	struct net_device *netdev = adapter->netdev;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   260
	irq_handler_t handler = e1000_intr;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   261
	int irq_flags = IRQF_SHARED;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   262
	int err;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   263
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   264
	if (adapter->ecdev)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   265
		return 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   266
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   267
	if (hw->mac_type >= e1000_82571) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   268
		adapter->have_msi = !pci_enable_msi(adapter->pdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   269
		if (adapter->have_msi) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   270
			handler = e1000_intr_msi;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   271
			irq_flags = 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   272
		}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   273
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   274
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   275
	err = request_irq(adapter->pdev->irq, handler, irq_flags, netdev->name,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   276
	                  netdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   277
	if (err) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   278
		if (adapter->have_msi)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   279
			pci_disable_msi(adapter->pdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   280
		DPRINTK(PROBE, ERR,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   281
		        "Unable to allocate interrupt Error: %d\n", err);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   282
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   283
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   284
	return err;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   285
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   286
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   287
static void e1000_free_irq(struct e1000_adapter *adapter)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   288
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   289
	struct net_device *netdev = adapter->netdev;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   290
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   291
	if (adapter->ecdev)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   292
		return;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   293
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   294
	free_irq(adapter->pdev->irq, netdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   295
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   296
	if (adapter->have_msi)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   297
		pci_disable_msi(adapter->pdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   298
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   299
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   300
/**
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   301
 * e1000_irq_disable - Mask off interrupt generation on the NIC
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   302
 * @adapter: board private structure
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   303
 **/
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   304
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   305
static void e1000_irq_disable(struct e1000_adapter *adapter)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   306
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   307
	struct e1000_hw *hw = &adapter->hw;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   308
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   309
	if (adapter->ecdev)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   310
		return;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   311
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   312
	ew32(IMC, ~0);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   313
	E1000_WRITE_FLUSH();
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   314
	synchronize_irq(adapter->pdev->irq);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   315
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   316
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   317
/**
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   318
 * e1000_irq_enable - Enable default interrupt generation settings
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   319
 * @adapter: board private structure
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   320
 **/
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   321
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   322
static void e1000_irq_enable(struct e1000_adapter *adapter)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   323
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   324
	struct e1000_hw *hw = &adapter->hw;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   325
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   326
	if (adapter->ecdev)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   327
		return;
2589
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2211
diff changeset
   328
1996
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   329
	ew32(IMS, IMS_ENABLE_MASK);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   330
	E1000_WRITE_FLUSH();
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   331
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   332
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   333
static void e1000_update_mng_vlan(struct e1000_adapter *adapter)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   334
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   335
	struct e1000_hw *hw = &adapter->hw;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   336
	struct net_device *netdev = adapter->netdev;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   337
	u16 vid = hw->mng_cookie.vlan_id;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   338
	u16 old_vid = adapter->mng_vlan_id;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   339
	if (adapter->vlgrp) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   340
		if (!vlan_group_get_device(adapter->vlgrp, vid)) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   341
			if (hw->mng_cookie.status &
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   342
				E1000_MNG_DHCP_COOKIE_STATUS_VLAN_SUPPORT) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   343
				e1000_vlan_rx_add_vid(netdev, vid);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   344
				adapter->mng_vlan_id = vid;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   345
			} else
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   346
				adapter->mng_vlan_id = E1000_MNG_VLAN_NONE;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   347
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   348
			if ((old_vid != (u16)E1000_MNG_VLAN_NONE) &&
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   349
					(vid != old_vid) &&
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   350
			    !vlan_group_get_device(adapter->vlgrp, old_vid))
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   351
				e1000_vlan_rx_kill_vid(netdev, old_vid);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   352
		} else
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   353
			adapter->mng_vlan_id = vid;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   354
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   355
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   356
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   357
/**
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   358
 * e1000_release_hw_control - release control of the h/w to f/w
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   359
 * @adapter: address of board private structure
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   360
 *
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   361
 * e1000_release_hw_control resets {CTRL_EXT|FWSM}:DRV_LOAD bit.
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   362
 * For ASF and Pass Through versions of f/w this means that the
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   363
 * driver is no longer loaded. For AMT version (only with 82573) i
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   364
 * of the f/w this means that the network i/f is closed.
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   365
 *
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   366
 **/
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   367
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   368
static void e1000_release_hw_control(struct e1000_adapter *adapter)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   369
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   370
	u32 ctrl_ext;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   371
	u32 swsm;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   372
	struct e1000_hw *hw = &adapter->hw;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   373
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   374
	/* Let firmware taken over control of h/w */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   375
	switch (hw->mac_type) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   376
	case e1000_82573:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   377
		swsm = er32(SWSM);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   378
		ew32(SWSM, swsm & ~E1000_SWSM_DRV_LOAD);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   379
		break;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   380
	case e1000_82571:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   381
	case e1000_82572:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   382
	case e1000_80003es2lan:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   383
	case e1000_ich8lan:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   384
		ctrl_ext = er32(CTRL_EXT);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   385
		ew32(CTRL_EXT, ctrl_ext & ~E1000_CTRL_EXT_DRV_LOAD);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   386
		break;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   387
	default:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   388
		break;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   389
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   390
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   391
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   392
/**
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   393
 * e1000_get_hw_control - get control of the h/w from f/w
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   394
 * @adapter: address of board private structure
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   395
 *
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   396
 * e1000_get_hw_control sets {CTRL_EXT|FWSM}:DRV_LOAD bit.
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   397
 * For ASF and Pass Through versions of f/w this means that
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   398
 * the driver is loaded. For AMT version (only with 82573)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   399
 * of the f/w this means that the network i/f is open.
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   400
 *
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   401
 **/
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   402
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   403
static void e1000_get_hw_control(struct e1000_adapter *adapter)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   404
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   405
	u32 ctrl_ext;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   406
	u32 swsm;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   407
	struct e1000_hw *hw = &adapter->hw;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   408
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   409
	/* Let firmware know the driver has taken over */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   410
	switch (hw->mac_type) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   411
	case e1000_82573:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   412
		swsm = er32(SWSM);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   413
		ew32(SWSM, swsm | E1000_SWSM_DRV_LOAD);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   414
		break;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   415
	case e1000_82571:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   416
	case e1000_82572:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   417
	case e1000_80003es2lan:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   418
	case e1000_ich8lan:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   419
		ctrl_ext = er32(CTRL_EXT);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   420
		ew32(CTRL_EXT, ctrl_ext | E1000_CTRL_EXT_DRV_LOAD);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   421
		break;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   422
	default:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   423
		break;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   424
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   425
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   426
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   427
static void e1000_init_manageability(struct e1000_adapter *adapter)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   428
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   429
	struct e1000_hw *hw = &adapter->hw;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   430
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   431
	if (adapter->en_mng_pt) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   432
		u32 manc = er32(MANC);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   433
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   434
		/* disable hardware interception of ARP */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   435
		manc &= ~(E1000_MANC_ARP_EN);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   436
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   437
		/* enable receiving management packets to the host */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   438
		/* this will probably generate destination unreachable messages
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   439
		 * from the host OS, but the packets will be handled on SMBUS */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   440
		if (hw->has_manc2h) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   441
			u32 manc2h = er32(MANC2H);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   442
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   443
			manc |= E1000_MANC_EN_MNG2HOST;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   444
#define E1000_MNG2HOST_PORT_623 (1 << 5)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   445
#define E1000_MNG2HOST_PORT_664 (1 << 6)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   446
			manc2h |= E1000_MNG2HOST_PORT_623;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   447
			manc2h |= E1000_MNG2HOST_PORT_664;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   448
			ew32(MANC2H, manc2h);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   449
		}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   450
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   451
		ew32(MANC, manc);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   452
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   453
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   454
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   455
static void e1000_release_manageability(struct e1000_adapter *adapter)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   456
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   457
	struct e1000_hw *hw = &adapter->hw;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   458
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   459
	if (adapter->en_mng_pt) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   460
		u32 manc = er32(MANC);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   461
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   462
		/* re-enable hardware interception of ARP */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   463
		manc |= E1000_MANC_ARP_EN;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   464
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   465
		if (hw->has_manc2h)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   466
			manc &= ~E1000_MANC_EN_MNG2HOST;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   467
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   468
		/* don't explicitly have to mess with MANC2H since
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   469
		 * MANC has an enable disable that gates MANC2H */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   470
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   471
		ew32(MANC, manc);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   472
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   473
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   474
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   475
/**
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   476
 * e1000_configure - configure the hardware for RX and TX
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   477
 * @adapter = private board structure
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   478
 **/
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   479
static void e1000_configure(struct e1000_adapter *adapter)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   480
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   481
	struct net_device *netdev = adapter->netdev;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   482
	int i;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   483
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   484
	e1000_set_rx_mode(netdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   485
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   486
	e1000_restore_vlan(adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   487
	e1000_init_manageability(adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   488
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   489
	e1000_configure_tx(adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   490
	e1000_setup_rctl(adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   491
	e1000_configure_rx(adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   492
	/* call E1000_DESC_UNUSED which always leaves
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   493
	 * at least 1 descriptor unused to make sure
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   494
	 * next_to_use != next_to_clean */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   495
	for (i = 0; i < adapter->num_rx_queues; i++) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   496
		struct e1000_rx_ring *ring = &adapter->rx_ring[i];
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   497
		if (adapter->ecdev) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   498
			/* fill rx ring completely! */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   499
			adapter->alloc_rx_buf(adapter, ring, ring->count);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   500
		} else {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   501
            /* this one leaves the last ring element unallocated! */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   502
			adapter->alloc_rx_buf(adapter, ring,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   503
					E1000_DESC_UNUSED(ring));
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   504
		}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   505
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   506
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   507
	adapter->tx_queue_len = netdev->tx_queue_len;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   508
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   509
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   510
int e1000_up(struct e1000_adapter *adapter)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   511
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   512
	struct e1000_hw *hw = &adapter->hw;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   513
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   514
	/* hardware has been reset, we need to reload some things */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   515
	e1000_configure(adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   516
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   517
	clear_bit(__E1000_DOWN, &adapter->flags);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   518
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   519
	if (!adapter->ecdev) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   520
		napi_enable(&adapter->napi);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   521
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   522
		e1000_irq_enable(adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   523
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   524
		netif_wake_queue(adapter->netdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   525
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   526
		/* fire a link change interrupt to start the watchdog */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   527
		ew32(ICS, E1000_ICS_LSC);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   528
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   529
	return 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   530
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   531
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   532
/**
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   533
 * e1000_power_up_phy - restore link in case the phy was powered down
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   534
 * @adapter: address of board private structure
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   535
 *
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   536
 * The phy may be powered down to save power and turn off link when the
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   537
 * driver is unloaded and wake on lan is not enabled (among others)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   538
 * *** this routine MUST be followed by a call to e1000_reset ***
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   539
 *
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   540
 **/
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   541
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   542
void e1000_power_up_phy(struct e1000_adapter *adapter)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   543
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   544
	struct e1000_hw *hw = &adapter->hw;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   545
	u16 mii_reg = 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   546
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   547
	/* Just clear the power down bit to wake the phy back up */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   548
	if (hw->media_type == e1000_media_type_copper) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   549
		/* according to the manual, the phy will retain its
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   550
		 * settings across a power-down/up cycle */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   551
		e1000_read_phy_reg(hw, PHY_CTRL, &mii_reg);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   552
		mii_reg &= ~MII_CR_POWER_DOWN;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   553
		e1000_write_phy_reg(hw, PHY_CTRL, mii_reg);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   554
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   555
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   556
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   557
static void e1000_power_down_phy(struct e1000_adapter *adapter)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   558
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   559
	struct e1000_hw *hw = &adapter->hw;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   560
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   561
	/* Power down the PHY so no link is implied when interface is down *
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   562
	 * The PHY cannot be powered down if any of the following is true *
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   563
	 * (a) WoL is enabled
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   564
	 * (b) AMT is active
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   565
	 * (c) SoL/IDER session is active */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   566
	if (!adapter->wol && hw->mac_type >= e1000_82540 &&
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   567
	   hw->media_type == e1000_media_type_copper) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   568
		u16 mii_reg = 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   569
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   570
		switch (hw->mac_type) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   571
		case e1000_82540:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   572
		case e1000_82545:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   573
		case e1000_82545_rev_3:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   574
		case e1000_82546:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   575
		case e1000_82546_rev_3:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   576
		case e1000_82541:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   577
		case e1000_82541_rev_2:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   578
		case e1000_82547:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   579
		case e1000_82547_rev_2:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   580
			if (er32(MANC) & E1000_MANC_SMBUS_EN)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   581
				goto out;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   582
			break;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   583
		case e1000_82571:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   584
		case e1000_82572:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   585
		case e1000_82573:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   586
		case e1000_80003es2lan:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   587
		case e1000_ich8lan:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   588
			if (e1000_check_mng_mode(hw) ||
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   589
			    e1000_check_phy_reset_block(hw))
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   590
				goto out;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   591
			break;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   592
		default:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   593
			goto out;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   594
		}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   595
		e1000_read_phy_reg(hw, PHY_CTRL, &mii_reg);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   596
		mii_reg |= MII_CR_POWER_DOWN;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   597
		e1000_write_phy_reg(hw, PHY_CTRL, mii_reg);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   598
		mdelay(1);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   599
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   600
out:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   601
	return;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   602
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   603
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   604
void e1000_down(struct e1000_adapter *adapter)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   605
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   606
	struct e1000_hw *hw = &adapter->hw;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   607
	struct net_device *netdev = adapter->netdev;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   608
	u32 rctl, tctl;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   609
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   610
	/* signal that we're down so the interrupt handler does not
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   611
	 * reschedule our watchdog timer */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   612
	set_bit(__E1000_DOWN, &adapter->flags);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   613
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   614
	/* disable receives in the hardware */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   615
	rctl = er32(RCTL);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   616
	ew32(RCTL, rctl & ~E1000_RCTL_EN);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   617
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   618
	if (!adapter->ecdev) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   619
		/* flush and sleep below */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   620
		/* can be netif_tx_disable when NETIF_F_LLTX is removed */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   621
		netif_stop_queue(netdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   622
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   623
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   624
	/* disable transmits in the hardware */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   625
	tctl = er32(TCTL);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   626
	tctl &= ~E1000_TCTL_EN;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   627
	ew32(TCTL, tctl);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   628
	/* flush both disables and wait for them to finish */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   629
	E1000_WRITE_FLUSH();
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   630
	msleep(10);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   631
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   632
	if (!adapter->ecdev) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   633
		napi_disable(&adapter->napi);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   634
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   635
		e1000_irq_disable(adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   636
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   637
		del_timer_sync(&adapter->tx_fifo_stall_timer);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   638
		del_timer_sync(&adapter->watchdog_timer);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   639
		del_timer_sync(&adapter->phy_info_timer);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   640
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   641
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   642
	netdev->tx_queue_len = adapter->tx_queue_len;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   643
	adapter->link_speed = 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   644
	adapter->link_duplex = 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   645
	if (!adapter->ecdev) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   646
		netif_carrier_off(netdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   647
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   648
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   649
	e1000_reset(adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   650
	e1000_clean_all_tx_rings(adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   651
	e1000_clean_all_rx_rings(adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   652
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   653
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   654
void e1000_reinit_locked(struct e1000_adapter *adapter)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   655
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   656
	WARN_ON(in_interrupt());
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   657
	while (test_and_set_bit(__E1000_RESETTING, &adapter->flags))
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   658
		msleep(1);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   659
	e1000_down(adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   660
	e1000_up(adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   661
	clear_bit(__E1000_RESETTING, &adapter->flags);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   662
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   663
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   664
void e1000_reset(struct e1000_adapter *adapter)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   665
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   666
	struct e1000_hw *hw = &adapter->hw;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   667
	u32 pba = 0, tx_space, min_tx_space, min_rx_space;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   668
	u16 fc_high_water_mark = E1000_FC_HIGH_DIFF;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   669
	bool legacy_pba_adjust = false;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   670
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   671
	/* Repartition Pba for greater than 9k mtu
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   672
	 * To take effect CTRL.RST is required.
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   673
	 */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   674
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   675
	switch (hw->mac_type) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   676
	case e1000_82542_rev2_0:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   677
	case e1000_82542_rev2_1:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   678
	case e1000_82543:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   679
	case e1000_82544:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   680
	case e1000_82540:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   681
	case e1000_82541:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   682
	case e1000_82541_rev_2:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   683
		legacy_pba_adjust = true;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   684
		pba = E1000_PBA_48K;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   685
		break;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   686
	case e1000_82545:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   687
	case e1000_82545_rev_3:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   688
	case e1000_82546:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   689
	case e1000_82546_rev_3:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   690
		pba = E1000_PBA_48K;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   691
		break;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   692
	case e1000_82547:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   693
	case e1000_82547_rev_2:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   694
		legacy_pba_adjust = true;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   695
		pba = E1000_PBA_30K;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   696
		break;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   697
	case e1000_82571:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   698
	case e1000_82572:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   699
	case e1000_80003es2lan:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   700
		pba = E1000_PBA_38K;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   701
		break;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   702
	case e1000_82573:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   703
		pba = E1000_PBA_20K;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   704
		break;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   705
	case e1000_ich8lan:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   706
		pba = E1000_PBA_8K;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   707
	case e1000_undefined:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   708
	case e1000_num_macs:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   709
		break;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   710
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   711
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   712
	if (legacy_pba_adjust) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   713
		if (adapter->netdev->mtu > E1000_RXBUFFER_8192)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   714
			pba -= 8; /* allocate more FIFO for Tx */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   715
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   716
		if (hw->mac_type == e1000_82547) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   717
			adapter->tx_fifo_head = 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   718
			adapter->tx_head_addr = pba << E1000_TX_HEAD_ADDR_SHIFT;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   719
			adapter->tx_fifo_size =
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   720
				(E1000_PBA_40K - pba) << E1000_PBA_BYTES_SHIFT;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   721
			atomic_set(&adapter->tx_fifo_stall, 0);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   722
		}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   723
	} else if (hw->max_frame_size > MAXIMUM_ETHERNET_FRAME_SIZE) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   724
		/* adjust PBA for jumbo frames */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   725
		ew32(PBA, pba);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   726
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   727
		/* To maintain wire speed transmits, the Tx FIFO should be
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   728
		 * large enough to accomodate two full transmit packets,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   729
		 * rounded up to the next 1KB and expressed in KB.  Likewise,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   730
		 * the Rx FIFO should be large enough to accomodate at least
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   731
		 * one full receive packet and is similarly rounded up and
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   732
		 * expressed in KB. */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   733
		pba = er32(PBA);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   734
		/* upper 16 bits has Tx packet buffer allocation size in KB */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   735
		tx_space = pba >> 16;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   736
		/* lower 16 bits has Rx packet buffer allocation size in KB */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   737
		pba &= 0xffff;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   738
		/* don't include ethernet FCS because hardware appends/strips */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   739
		min_rx_space = adapter->netdev->mtu + ENET_HEADER_SIZE +
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   740
		               VLAN_TAG_SIZE;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   741
		min_tx_space = min_rx_space;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   742
		min_tx_space *= 2;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   743
		min_tx_space = ALIGN(min_tx_space, 1024);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   744
		min_tx_space >>= 10;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   745
		min_rx_space = ALIGN(min_rx_space, 1024);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   746
		min_rx_space >>= 10;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   747
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   748
		/* If current Tx allocation is less than the min Tx FIFO size,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   749
		 * and the min Tx FIFO size is less than the current Rx FIFO
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   750
		 * allocation, take space away from current Rx allocation */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   751
		if (tx_space < min_tx_space &&
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   752
		    ((min_tx_space - tx_space) < pba)) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   753
			pba = pba - (min_tx_space - tx_space);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   754
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   755
			/* PCI/PCIx hardware has PBA alignment constraints */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   756
			switch (hw->mac_type) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   757
			case e1000_82545 ... e1000_82546_rev_3:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   758
				pba &= ~(E1000_PBA_8K - 1);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   759
				break;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   760
			default:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   761
				break;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   762
			}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   763
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   764
			/* if short on rx space, rx wins and must trump tx
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   765
			 * adjustment or use Early Receive if available */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   766
			if (pba < min_rx_space) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   767
				switch (hw->mac_type) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   768
				case e1000_82573:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   769
					/* ERT enabled in e1000_configure_rx */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   770
					break;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   771
				default:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   772
					pba = min_rx_space;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   773
					break;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   774
				}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   775
			}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   776
		}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   777
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   778
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   779
	ew32(PBA, pba);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   780
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   781
	/* flow control settings */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   782
	/* Set the FC high water mark to 90% of the FIFO size.
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   783
	 * Required to clear last 3 LSB */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   784
	fc_high_water_mark = ((pba * 9216)/10) & 0xFFF8;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   785
	/* We can't use 90% on small FIFOs because the remainder
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   786
	 * would be less than 1 full frame.  In this case, we size
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   787
	 * it to allow at least a full frame above the high water
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   788
	 *  mark. */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   789
	if (pba < E1000_PBA_16K)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   790
		fc_high_water_mark = (pba * 1024) - 1600;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   791
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   792
	hw->fc_high_water = fc_high_water_mark;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   793
	hw->fc_low_water = fc_high_water_mark - 8;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   794
	if (hw->mac_type == e1000_80003es2lan)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   795
		hw->fc_pause_time = 0xFFFF;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   796
	else
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   797
		hw->fc_pause_time = E1000_FC_PAUSE_TIME;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   798
	hw->fc_send_xon = 1;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   799
	hw->fc = hw->original_fc;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   800
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   801
	/* Allow time for pending master requests to run */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   802
	e1000_reset_hw(hw);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   803
	if (hw->mac_type >= e1000_82544)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   804
		ew32(WUC, 0);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   805
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   806
	if (e1000_init_hw(hw))
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   807
		DPRINTK(PROBE, ERR, "Hardware Error\n");
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   808
	e1000_update_mng_vlan(adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   809
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   810
	/* if (adapter->hwflags & HWFLAGS_PHY_PWR_BIT) { */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   811
	if (hw->mac_type >= e1000_82544 &&
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   812
	    hw->mac_type <= e1000_82547_rev_2 &&
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   813
	    hw->autoneg == 1 &&
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   814
	    hw->autoneg_advertised == ADVERTISE_1000_FULL) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   815
		u32 ctrl = er32(CTRL);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   816
		/* clear phy power management bit if we are in gig only mode,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   817
		 * which if enabled will attempt negotiation to 100Mb, which
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   818
		 * can cause a loss of link at power off or driver unload */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   819
		ctrl &= ~E1000_CTRL_SWDPIN3;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   820
		ew32(CTRL, ctrl);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   821
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   822
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   823
	/* Enable h/w to recognize an 802.1Q VLAN Ethernet packet */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   824
	ew32(VET, ETHERNET_IEEE_VLAN_TYPE);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   825
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   826
	e1000_reset_adaptive(hw);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   827
	e1000_phy_get_info(hw, &adapter->phy_info);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   828
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   829
	if (!adapter->smart_power_down &&
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   830
	    (hw->mac_type == e1000_82571 ||
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   831
	     hw->mac_type == e1000_82572)) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   832
		u16 phy_data = 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   833
		/* speed up time to link by disabling smart power down, ignore
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   834
		 * the return value of this function because there is nothing
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   835
		 * different we would do if it failed */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   836
		e1000_read_phy_reg(hw, IGP02E1000_PHY_POWER_MGMT,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   837
		                   &phy_data);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   838
		phy_data &= ~IGP02E1000_PM_SPD;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   839
		e1000_write_phy_reg(hw, IGP02E1000_PHY_POWER_MGMT,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   840
		                    phy_data);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   841
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   842
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   843
	e1000_release_manageability(adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   844
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   845
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   846
/**
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   847
 *  Dump the eeprom for users having checksum issues
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   848
 **/
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   849
static void e1000_dump_eeprom(struct e1000_adapter *adapter)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   850
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   851
	struct net_device *netdev = adapter->netdev;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   852
	struct ethtool_eeprom eeprom;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   853
	const struct ethtool_ops *ops = netdev->ethtool_ops;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   854
	u8 *data;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   855
	int i;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   856
	u16 csum_old, csum_new = 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   857
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   858
	eeprom.len = ops->get_eeprom_len(netdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   859
	eeprom.offset = 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   860
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   861
	data = kmalloc(eeprom.len, GFP_KERNEL);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   862
	if (!data) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   863
		printk(KERN_ERR "Unable to allocate memory to dump EEPROM"
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   864
		       " data\n");
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   865
		return;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   866
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   867
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   868
	ops->get_eeprom(netdev, &eeprom, data);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   869
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   870
	csum_old = (data[EEPROM_CHECKSUM_REG * 2]) +
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   871
		   (data[EEPROM_CHECKSUM_REG * 2 + 1] << 8);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   872
	for (i = 0; i < EEPROM_CHECKSUM_REG * 2; i += 2)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   873
		csum_new += data[i] + (data[i + 1] << 8);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   874
	csum_new = EEPROM_SUM - csum_new;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   875
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   876
	printk(KERN_ERR "/*********************/\n");
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   877
	printk(KERN_ERR "Current EEPROM Checksum : 0x%04x\n", csum_old);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   878
	printk(KERN_ERR "Calculated              : 0x%04x\n", csum_new);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   879
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   880
	printk(KERN_ERR "Offset    Values\n");
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   881
	printk(KERN_ERR "========  ======\n");
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   882
	print_hex_dump(KERN_ERR, "", DUMP_PREFIX_OFFSET, 16, 1, data, 128, 0);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   883
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   884
	printk(KERN_ERR "Include this output when contacting your support "
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   885
	       "provider.\n");
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   886
	printk(KERN_ERR "This is not a software error! Something bad "
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   887
	       "happened to your hardware or\n");
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   888
	printk(KERN_ERR "EEPROM image. Ignoring this "
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   889
	       "problem could result in further problems,\n");
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   890
	printk(KERN_ERR "possibly loss of data, corruption or system hangs!\n");
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   891
	printk(KERN_ERR "The MAC Address will be reset to 00:00:00:00:00:00, "
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   892
	       "which is invalid\n");
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   893
	printk(KERN_ERR "and requires you to set the proper MAC "
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   894
	       "address manually before continuing\n");
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   895
	printk(KERN_ERR "to enable this network device.\n");
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   896
	printk(KERN_ERR "Please inspect the EEPROM dump and report the issue "
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   897
	       "to your hardware vendor\n");
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   898
	printk(KERN_ERR "or Intel Customer Support.\n");
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   899
	printk(KERN_ERR "/*********************/\n");
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   900
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   901
	kfree(data);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   902
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   903
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   904
/**
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   905
 * e1000_is_need_ioport - determine if an adapter needs ioport resources or not
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   906
 * @pdev: PCI device information struct
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   907
 *
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   908
 * Return true if an adapter needs ioport resources
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   909
 **/
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   910
static int e1000_is_need_ioport(struct pci_dev *pdev)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   911
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   912
	switch (pdev->device) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   913
	case E1000_DEV_ID_82540EM:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   914
	case E1000_DEV_ID_82540EM_LOM:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   915
	case E1000_DEV_ID_82540EP:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   916
	case E1000_DEV_ID_82540EP_LOM:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   917
	case E1000_DEV_ID_82540EP_LP:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   918
	case E1000_DEV_ID_82541EI:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   919
	case E1000_DEV_ID_82541EI_MOBILE:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   920
	case E1000_DEV_ID_82541ER:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   921
	case E1000_DEV_ID_82541ER_LOM:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   922
	case E1000_DEV_ID_82541GI:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   923
	case E1000_DEV_ID_82541GI_LF:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   924
	case E1000_DEV_ID_82541GI_MOBILE:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   925
	case E1000_DEV_ID_82544EI_COPPER:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   926
	case E1000_DEV_ID_82544EI_FIBER:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   927
	case E1000_DEV_ID_82544GC_COPPER:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   928
	case E1000_DEV_ID_82544GC_LOM:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   929
	case E1000_DEV_ID_82545EM_COPPER:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   930
	case E1000_DEV_ID_82545EM_FIBER:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   931
	case E1000_DEV_ID_82546EB_COPPER:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   932
	case E1000_DEV_ID_82546EB_FIBER:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   933
	case E1000_DEV_ID_82546EB_QUAD_COPPER:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   934
		return true;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   935
	default:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   936
		return false;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   937
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   938
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   939
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   940
static const struct net_device_ops e1000_netdev_ops = {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   941
	.ndo_open		= e1000_open,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   942
	.ndo_stop		= e1000_close,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   943
	.ndo_start_xmit		= e1000_xmit_frame,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   944
	.ndo_get_stats		= e1000_get_stats,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   945
	.ndo_set_rx_mode	= e1000_set_rx_mode,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   946
	.ndo_set_mac_address	= e1000_set_mac,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   947
	.ndo_tx_timeout 	= e1000_tx_timeout,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   948
	.ndo_change_mtu		= e1000_change_mtu,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   949
	.ndo_do_ioctl		= e1000_ioctl,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   950
	.ndo_validate_addr	= eth_validate_addr,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   951
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   952
	.ndo_vlan_rx_register	= e1000_vlan_rx_register,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   953
	.ndo_vlan_rx_add_vid	= e1000_vlan_rx_add_vid,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   954
	.ndo_vlan_rx_kill_vid	= e1000_vlan_rx_kill_vid,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   955
#ifdef CONFIG_NET_POLL_CONTROLLER
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   956
	.ndo_poll_controller	= e1000_netpoll,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   957
#endif
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   958
};
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   959
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   960
/**
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   961
 * e1000_probe - Device Initialization Routine
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   962
 * @pdev: PCI device information struct
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   963
 * @ent: entry in e1000_pci_tbl
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   964
 *
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   965
 * Returns 0 on success, negative on failure
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   966
 *
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   967
 * e1000_probe initializes an adapter identified by a pci_dev structure.
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   968
 * The OS initialization, configuring of the adapter private structure,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   969
 * and a hardware reset occur.
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   970
 **/
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   971
static int __devinit e1000_probe(struct pci_dev *pdev,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   972
				 const struct pci_device_id *ent)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   973
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   974
	struct net_device *netdev;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   975
	struct e1000_adapter *adapter;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   976
	struct e1000_hw *hw;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   977
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   978
	static int cards_found = 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   979
	static int global_quad_port_a = 0; /* global ksp3 port a indication */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   980
	int i, err, pci_using_dac;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   981
	u16 eeprom_data = 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   982
	u16 eeprom_apme_mask = E1000_EEPROM_APME;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   983
	int bars, need_ioport;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   984
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   985
	/* do not allocate ioport bars when not needed */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   986
	need_ioport = e1000_is_need_ioport(pdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   987
	if (need_ioport) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   988
		bars = pci_select_bars(pdev, IORESOURCE_MEM | IORESOURCE_IO);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   989
		err = pci_enable_device(pdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   990
	} else {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   991
		bars = pci_select_bars(pdev, IORESOURCE_MEM);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   992
		err = pci_enable_device_mem(pdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   993
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   994
	if (err)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   995
		return err;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   996
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   997
	if (!pci_set_dma_mask(pdev, DMA_BIT_MASK(64)) &&
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   998
	    !pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64))) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   999
		pci_using_dac = 1;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1000
	} else {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1001
		err = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1002
		if (err) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1003
			err = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32));
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1004
			if (err) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1005
				E1000_ERR("No usable DMA configuration, "
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1006
					  "aborting\n");
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1007
				goto err_dma;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1008
			}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1009
		}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1010
		pci_using_dac = 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1011
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1012
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1013
	err = pci_request_selected_regions(pdev, bars, e1000_driver_name);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1014
	if (err)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1015
		goto err_pci_reg;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1016
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1017
	pci_set_master(pdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1018
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1019
	err = -ENOMEM;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1020
	netdev = alloc_etherdev(sizeof(struct e1000_adapter));
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1021
	if (!netdev)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1022
		goto err_alloc_etherdev;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1023
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1024
	SET_NETDEV_DEV(netdev, &pdev->dev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1025
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1026
	pci_set_drvdata(pdev, netdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1027
	adapter = netdev_priv(netdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1028
	adapter->netdev = netdev;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1029
	adapter->pdev = pdev;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1030
	adapter->msg_enable = (1 << debug) - 1;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1031
	adapter->bars = bars;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1032
	adapter->need_ioport = need_ioport;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1033
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1034
	hw = &adapter->hw;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1035
	hw->back = adapter;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1036
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1037
	err = -EIO;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1038
	hw->hw_addr = pci_ioremap_bar(pdev, BAR_0);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1039
	if (!hw->hw_addr)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1040
		goto err_ioremap;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1041
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1042
	if (adapter->need_ioport) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1043
		for (i = BAR_1; i <= BAR_5; i++) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1044
			if (pci_resource_len(pdev, i) == 0)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1045
				continue;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1046
			if (pci_resource_flags(pdev, i) & IORESOURCE_IO) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1047
				hw->io_base = pci_resource_start(pdev, i);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1048
				break;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1049
			}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1050
		}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1051
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1052
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1053
	netdev->netdev_ops = &e1000_netdev_ops;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1054
	e1000_set_ethtool_ops(netdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1055
	netdev->watchdog_timeo = 5 * HZ;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1056
	netif_napi_add(netdev, &adapter->napi, e1000_clean, 64);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1057
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1058
	strncpy(netdev->name, pci_name(pdev), sizeof(netdev->name) - 1);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1059
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1060
	adapter->bd_number = cards_found;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1061
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1062
	/* setup the private structure */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1063
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1064
	err = e1000_sw_init(adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1065
	if (err)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1066
		goto err_sw_init;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1067
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1068
	err = -EIO;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1069
	/* Flash BAR mapping must happen after e1000_sw_init
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1070
	 * because it depends on mac_type */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1071
	if ((hw->mac_type == e1000_ich8lan) &&
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1072
	   (pci_resource_flags(pdev, 1) & IORESOURCE_MEM)) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1073
		hw->flash_address = pci_ioremap_bar(pdev, 1);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1074
		if (!hw->flash_address)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1075
			goto err_flashmap;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1076
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1077
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1078
	if (e1000_check_phy_reset_block(hw))
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1079
		DPRINTK(PROBE, INFO, "PHY reset is blocked due to SOL/IDER session.\n");
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1080
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1081
	if (hw->mac_type >= e1000_82543) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1082
		netdev->features = NETIF_F_SG |
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1083
				   NETIF_F_HW_CSUM |
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1084
				   NETIF_F_HW_VLAN_TX |
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1085
				   NETIF_F_HW_VLAN_RX |
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1086
				   NETIF_F_HW_VLAN_FILTER;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1087
		if (hw->mac_type == e1000_ich8lan)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1088
			netdev->features &= ~NETIF_F_HW_VLAN_FILTER;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1089
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1090
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1091
	if ((hw->mac_type >= e1000_82544) &&
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1092
	   (hw->mac_type != e1000_82547))
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1093
		netdev->features |= NETIF_F_TSO;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1094
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1095
	if (hw->mac_type > e1000_82547_rev_2)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1096
		netdev->features |= NETIF_F_TSO6;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1097
	if (pci_using_dac)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1098
		netdev->features |= NETIF_F_HIGHDMA;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1099
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1100
	netdev->vlan_features |= NETIF_F_TSO;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1101
	netdev->vlan_features |= NETIF_F_TSO6;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1102
	netdev->vlan_features |= NETIF_F_HW_CSUM;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1103
	netdev->vlan_features |= NETIF_F_SG;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1104
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1105
	adapter->en_mng_pt = e1000_enable_mng_pass_thru(hw);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1106
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1107
	/* initialize eeprom parameters */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1108
	if (e1000_init_eeprom_params(hw)) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1109
		E1000_ERR("EEPROM initialization failed\n");
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1110
		goto err_eeprom;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1111
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1112
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1113
	/* before reading the EEPROM, reset the controller to
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1114
	 * put the device in a known good starting state */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1115
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1116
	e1000_reset_hw(hw);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1117
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1118
	/* make sure the EEPROM is good */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1119
	if (e1000_validate_eeprom_checksum(hw) < 0) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1120
		DPRINTK(PROBE, ERR, "The EEPROM Checksum Is Not Valid\n");
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1121
		e1000_dump_eeprom(adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1122
		/*
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1123
		 * set MAC address to all zeroes to invalidate and temporary
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1124
		 * disable this device for the user. This blocks regular
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1125
		 * traffic while still permitting ethtool ioctls from reaching
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1126
		 * the hardware as well as allowing the user to run the
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1127
		 * interface after manually setting a hw addr using
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1128
		 * `ip set address`
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1129
		 */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1130
		memset(hw->mac_addr, 0, netdev->addr_len);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1131
	} else {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1132
		/* copy the MAC address out of the EEPROM */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1133
		if (e1000_read_mac_addr(hw))
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1134
			DPRINTK(PROBE, ERR, "EEPROM Read Error\n");
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1135
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1136
	/* don't block initalization here due to bad MAC address */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1137
	memcpy(netdev->dev_addr, hw->mac_addr, netdev->addr_len);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1138
	memcpy(netdev->perm_addr, hw->mac_addr, netdev->addr_len);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1139
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1140
	if (!is_valid_ether_addr(netdev->perm_addr))
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1141
		DPRINTK(PROBE, ERR, "Invalid MAC Address\n");
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1142
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1143
	e1000_get_bus_info(hw);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1144
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1145
	init_timer(&adapter->tx_fifo_stall_timer);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1146
	adapter->tx_fifo_stall_timer.function = &e1000_82547_tx_fifo_stall;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1147
	adapter->tx_fifo_stall_timer.data = (unsigned long)adapter;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1148
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1149
	init_timer(&adapter->watchdog_timer);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1150
	adapter->watchdog_timer.function = &e1000_watchdog;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1151
	adapter->watchdog_timer.data = (unsigned long) adapter;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1152
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1153
	init_timer(&adapter->phy_info_timer);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1154
	adapter->phy_info_timer.function = &e1000_update_phy_info;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1155
	adapter->phy_info_timer.data = (unsigned long)adapter;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1156
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1157
	INIT_WORK(&adapter->reset_task, e1000_reset_task);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1158
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1159
	e1000_check_options(adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1160
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1161
	/* Initial Wake on LAN setting
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1162
	 * If APM wake is enabled in the EEPROM,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1163
	 * enable the ACPI Magic Packet filter
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1164
	 */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1165
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1166
	switch (hw->mac_type) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1167
	case e1000_82542_rev2_0:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1168
	case e1000_82542_rev2_1:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1169
	case e1000_82543:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1170
		break;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1171
	case e1000_82544:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1172
		e1000_read_eeprom(hw,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1173
			EEPROM_INIT_CONTROL2_REG, 1, &eeprom_data);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1174
		eeprom_apme_mask = E1000_EEPROM_82544_APM;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1175
		break;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1176
	case e1000_ich8lan:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1177
		e1000_read_eeprom(hw,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1178
			EEPROM_INIT_CONTROL1_REG, 1, &eeprom_data);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1179
		eeprom_apme_mask = E1000_EEPROM_ICH8_APME;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1180
		break;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1181
	case e1000_82546:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1182
	case e1000_82546_rev_3:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1183
	case e1000_82571:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1184
	case e1000_80003es2lan:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1185
		if (er32(STATUS) & E1000_STATUS_FUNC_1){
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1186
			e1000_read_eeprom(hw,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1187
				EEPROM_INIT_CONTROL3_PORT_B, 1, &eeprom_data);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1188
			break;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1189
		}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1190
		/* Fall Through */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1191
	default:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1192
		e1000_read_eeprom(hw,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1193
			EEPROM_INIT_CONTROL3_PORT_A, 1, &eeprom_data);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1194
		break;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1195
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1196
	if (eeprom_data & eeprom_apme_mask)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1197
		adapter->eeprom_wol |= E1000_WUFC_MAG;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1198
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1199
	/* now that we have the eeprom settings, apply the special cases
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1200
	 * where the eeprom may be wrong or the board simply won't support
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1201
	 * wake on lan on a particular port */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1202
	switch (pdev->device) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1203
	case E1000_DEV_ID_82546GB_PCIE:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1204
		adapter->eeprom_wol = 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1205
		break;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1206
	case E1000_DEV_ID_82546EB_FIBER:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1207
	case E1000_DEV_ID_82546GB_FIBER:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1208
	case E1000_DEV_ID_82571EB_FIBER:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1209
		/* Wake events only supported on port A for dual fiber
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1210
		 * regardless of eeprom setting */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1211
		if (er32(STATUS) & E1000_STATUS_FUNC_1)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1212
			adapter->eeprom_wol = 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1213
		break;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1214
	case E1000_DEV_ID_82546GB_QUAD_COPPER_KSP3:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1215
	case E1000_DEV_ID_82571EB_QUAD_COPPER:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1216
	case E1000_DEV_ID_82571EB_QUAD_FIBER:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1217
	case E1000_DEV_ID_82571EB_QUAD_COPPER_LOWPROFILE:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1218
	case E1000_DEV_ID_82571PT_QUAD_COPPER:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1219
		/* if quad port adapter, disable WoL on all but port A */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1220
		if (global_quad_port_a != 0)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1221
			adapter->eeprom_wol = 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1222
		else
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1223
			adapter->quad_port_a = 1;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1224
		/* Reset for multiple quad port adapters */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1225
		if (++global_quad_port_a == 4)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1226
			global_quad_port_a = 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1227
		break;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1228
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1229
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1230
	/* initialize the wol settings based on the eeprom settings */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1231
	adapter->wol = adapter->eeprom_wol;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1232
	device_set_wakeup_enable(&adapter->pdev->dev, adapter->wol);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1233
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1234
	/* print bus type/speed/width info */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1235
	DPRINTK(PROBE, INFO, "(PCI%s:%s:%s) ",
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1236
		((hw->bus_type == e1000_bus_type_pcix) ? "-X" :
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1237
		 (hw->bus_type == e1000_bus_type_pci_express ? " Express":"")),
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1238
		((hw->bus_speed == e1000_bus_speed_2500) ? "2.5Gb/s" :
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1239
		 (hw->bus_speed == e1000_bus_speed_133) ? "133MHz" :
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1240
		 (hw->bus_speed == e1000_bus_speed_120) ? "120MHz" :
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1241
		 (hw->bus_speed == e1000_bus_speed_100) ? "100MHz" :
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1242
		 (hw->bus_speed == e1000_bus_speed_66) ? "66MHz" : "33MHz"),
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1243
		((hw->bus_width == e1000_bus_width_64) ? "64-bit" :
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1244
		 (hw->bus_width == e1000_bus_width_pciex_4) ? "Width x4" :
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1245
		 (hw->bus_width == e1000_bus_width_pciex_1) ? "Width x1" :
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1246
		 "32-bit"));
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1247
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1248
	printk("%pM\n", netdev->dev_addr);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1249
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1250
	if (hw->bus_type == e1000_bus_type_pci_express) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1251
		DPRINTK(PROBE, WARNING, "This device (id %04x:%04x) will no "
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1252
			"longer be supported by this driver in the future.\n",
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1253
			pdev->vendor, pdev->device);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1254
		DPRINTK(PROBE, WARNING, "please use the \"e1000e\" "
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1255
			"driver instead.\n");
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1256
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1257
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1258
	/* reset the hardware with the new settings */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1259
	e1000_reset(adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1260
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1261
	/* If the controller is 82573 and f/w is AMT, do not set
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1262
	 * DRV_LOAD until the interface is up.  For all other cases,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1263
	 * let the f/w know that the h/w is now under the control
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1264
	 * of the driver. */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1265
	if (hw->mac_type != e1000_82573 ||
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1266
	    !e1000_check_mng_mode(hw))
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1267
		e1000_get_hw_control(adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1268
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1269
 	// offer device to EtherCAT master module
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1270
	adapter->ecdev = ecdev_offer(netdev, ec_poll, THIS_MODULE);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1271
	if (adapter->ecdev) {
2589
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2211
diff changeset
  1272
		err = ecdev_open(adapter->ecdev);
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2211
diff changeset
  1273
		if (err) {
1996
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1274
			ecdev_withdraw(adapter->ecdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1275
			goto err_register;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1276
		}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1277
	} else {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1278
		strcpy(netdev->name, "eth%d");
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1279
		err = register_netdev(netdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1280
		if (err)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1281
			goto err_register;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1282
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1283
		/* carrier off reporting is important to ethtool even BEFORE open */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1284
		netif_carrier_off(netdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1285
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1286
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1287
	DPRINTK(PROBE, INFO, "Intel(R) PRO/1000 Network Connection\n");
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1288
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1289
	cards_found++;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1290
	return 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1291
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1292
err_register:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1293
	e1000_release_hw_control(adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1294
err_eeprom:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1295
	if (!e1000_check_phy_reset_block(hw))
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1296
		e1000_phy_hw_reset(hw);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1297
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1298
	if (hw->flash_address)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1299
		iounmap(hw->flash_address);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1300
err_flashmap:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1301
	kfree(adapter->tx_ring);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1302
	kfree(adapter->rx_ring);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1303
err_sw_init:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1304
	iounmap(hw->hw_addr);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1305
err_ioremap:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1306
	free_netdev(netdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1307
err_alloc_etherdev:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1308
	pci_release_selected_regions(pdev, bars);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1309
err_pci_reg:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1310
err_dma:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1311
	pci_disable_device(pdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1312
	return err;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1313
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1314
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1315
/**
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1316
 * e1000_remove - Device Removal Routine
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1317
 * @pdev: PCI device information struct
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1318
 *
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1319
 * e1000_remove is called by the PCI subsystem to alert the driver
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1320
 * that it should release a PCI device.  The could be caused by a
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1321
 * Hot-Plug event, or because the driver is going to be removed from
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1322
 * memory.
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1323
 **/
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1324
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1325
static void __devexit e1000_remove(struct pci_dev *pdev)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1326
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1327
	struct net_device *netdev = pci_get_drvdata(pdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1328
	struct e1000_adapter *adapter = netdev_priv(netdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1329
	struct e1000_hw *hw = &adapter->hw;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1330
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1331
	cancel_work_sync(&adapter->reset_task);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1332
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1333
	e1000_release_manageability(adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1334
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1335
	/* Release control of h/w to f/w.  If f/w is AMT enabled, this
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1336
	 * would have already happened in close and is redundant. */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1337
	e1000_release_hw_control(adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1338
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1339
	if (adapter->ecdev) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1340
		ecdev_close(adapter->ecdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1341
		ecdev_withdraw(adapter->ecdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1342
	} else {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1343
		unregister_netdev(netdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1344
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1345
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1346
	if (!e1000_check_phy_reset_block(hw))
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1347
		e1000_phy_hw_reset(hw);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1348
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1349
	kfree(adapter->tx_ring);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1350
	kfree(adapter->rx_ring);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1351
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1352
	iounmap(hw->hw_addr);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1353
	if (hw->flash_address)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1354
		iounmap(hw->flash_address);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1355
	pci_release_selected_regions(pdev, adapter->bars);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1356
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1357
	free_netdev(netdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1358
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1359
	pci_disable_device(pdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1360
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1361
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1362
/**
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1363
 * e1000_sw_init - Initialize general software structures (struct e1000_adapter)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1364
 * @adapter: board private structure to initialize
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1365
 *
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1366
 * e1000_sw_init initializes the Adapter private data structure.
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1367
 * Fields are initialized based on PCI device information and
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1368
 * OS network device settings (MTU size).
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1369
 **/
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1370
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1371
static int __devinit e1000_sw_init(struct e1000_adapter *adapter)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1372
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1373
	struct e1000_hw *hw = &adapter->hw;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1374
	struct net_device *netdev = adapter->netdev;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1375
	struct pci_dev *pdev = adapter->pdev;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1376
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1377
	/* PCI config space info */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1378
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1379
	hw->vendor_id = pdev->vendor;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1380
	hw->device_id = pdev->device;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1381
	hw->subsystem_vendor_id = pdev->subsystem_vendor;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1382
	hw->subsystem_id = pdev->subsystem_device;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1383
	hw->revision_id = pdev->revision;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1384
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1385
	pci_read_config_word(pdev, PCI_COMMAND, &hw->pci_cmd_word);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1386
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1387
	adapter->rx_buffer_len = MAXIMUM_ETHERNET_VLAN_SIZE;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1388
	hw->max_frame_size = netdev->mtu +
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1389
			     ENET_HEADER_SIZE + ETHERNET_FCS_SIZE;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1390
	hw->min_frame_size = MINIMUM_ETHERNET_FRAME_SIZE;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1391
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1392
	/* identify the MAC */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1393
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1394
	if (e1000_set_mac_type(hw)) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1395
		DPRINTK(PROBE, ERR, "Unknown MAC Type\n");
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1396
		return -EIO;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1397
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1398
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1399
	switch (hw->mac_type) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1400
	default:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1401
		break;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1402
	case e1000_82541:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1403
	case e1000_82547:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1404
	case e1000_82541_rev_2:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1405
	case e1000_82547_rev_2:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1406
		hw->phy_init_script = 1;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1407
		break;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1408
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1409
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1410
	e1000_set_media_type(hw);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1411
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1412
	hw->wait_autoneg_complete = false;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1413
	hw->tbi_compatibility_en = true;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1414
	hw->adaptive_ifs = true;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1415
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1416
	/* Copper options */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1417
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1418
	if (hw->media_type == e1000_media_type_copper) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1419
		hw->mdix = AUTO_ALL_MODES;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1420
		hw->disable_polarity_correction = false;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1421
		hw->master_slave = E1000_MASTER_SLAVE;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1422
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1423
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1424
	adapter->num_tx_queues = 1;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1425
	adapter->num_rx_queues = 1;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1426
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1427
	if (e1000_alloc_queues(adapter)) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1428
		DPRINTK(PROBE, ERR, "Unable to allocate memory for queues\n");
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1429
		return -ENOMEM;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1430
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1431
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1432
	/* Explicitly disable IRQ since the NIC can be in any state. */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1433
	e1000_irq_disable(adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1434
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1435
	spin_lock_init(&adapter->stats_lock);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1436
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1437
	set_bit(__E1000_DOWN, &adapter->flags);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1438
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1439
	return 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1440
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1441
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1442
/**
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1443
 * e1000_alloc_queues - Allocate memory for all rings
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1444
 * @adapter: board private structure to initialize
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1445
 *
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1446
 * We allocate one ring per queue at run-time since we don't know the
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1447
 * number of queues at compile-time.
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1448
 **/
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1449
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1450
static int __devinit e1000_alloc_queues(struct e1000_adapter *adapter)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1451
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1452
	adapter->tx_ring = kcalloc(adapter->num_tx_queues,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1453
	                           sizeof(struct e1000_tx_ring), GFP_KERNEL);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1454
	if (!adapter->tx_ring)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1455
		return -ENOMEM;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1456
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1457
	adapter->rx_ring = kcalloc(adapter->num_rx_queues,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1458
	                           sizeof(struct e1000_rx_ring), GFP_KERNEL);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1459
	if (!adapter->rx_ring) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1460
		kfree(adapter->tx_ring);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1461
		return -ENOMEM;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1462
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1463
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1464
	return E1000_SUCCESS;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1465
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1466
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1467
/**
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1468
 * e1000_open - Called when a network interface is made active
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1469
 * @netdev: network interface device structure
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1470
 *
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1471
 * Returns 0 on success, negative value on failure
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1472
 *
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1473
 * The open entry point is called when a network interface is made
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1474
 * active by the system (IFF_UP).  At this point all resources needed
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1475
 * for transmit and receive operations are allocated, the interrupt
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1476
 * handler is registered with the OS, the watchdog timer is started,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1477
 * and the stack is notified that the interface is ready.
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1478
 **/
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1479
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1480
static int e1000_open(struct net_device *netdev)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1481
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1482
	struct e1000_adapter *adapter = netdev_priv(netdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1483
	struct e1000_hw *hw = &adapter->hw;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1484
	int err;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1485
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1486
	/* disallow open during test */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1487
	if (test_bit(__E1000_TESTING, &adapter->flags))
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1488
		return -EBUSY;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1489
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1490
	netif_carrier_off(netdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1491
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1492
	/* allocate transmit descriptors */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1493
	err = e1000_setup_all_tx_resources(adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1494
	if (err)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1495
		goto err_setup_tx;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1496
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1497
	/* allocate receive descriptors */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1498
	err = e1000_setup_all_rx_resources(adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1499
	if (err)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1500
		goto err_setup_rx;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1501
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1502
	e1000_power_up_phy(adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1503
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1504
	adapter->mng_vlan_id = E1000_MNG_VLAN_NONE;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1505
	if ((hw->mng_cookie.status &
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1506
			  E1000_MNG_DHCP_COOKIE_STATUS_VLAN_SUPPORT)) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1507
		e1000_update_mng_vlan(adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1508
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1509
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1510
	/* If AMT is enabled, let the firmware know that the network
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1511
	 * interface is now open */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1512
	if (hw->mac_type == e1000_82573 &&
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1513
	    e1000_check_mng_mode(hw))
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1514
		e1000_get_hw_control(adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1515
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1516
	/* before we allocate an interrupt, we must be ready to handle it.
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1517
	 * Setting DEBUG_SHIRQ in the kernel makes it fire an interrupt
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1518
	 * as soon as we call pci_request_irq, so we have to setup our
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1519
	 * clean_rx handler before we do so.  */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1520
	e1000_configure(adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1521
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1522
	err = e1000_request_irq(adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1523
	if (err)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1524
		goto err_req_irq;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1525
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1526
	/* From here on the code is the same as e1000_up() */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1527
	clear_bit(__E1000_DOWN, &adapter->flags);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1528
2589
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2211
diff changeset
  1529
	if (!adapter->ecdev) {
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2211
diff changeset
  1530
		napi_enable(&adapter->napi);
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2211
diff changeset
  1531
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2211
diff changeset
  1532
		e1000_irq_enable(adapter);
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2211
diff changeset
  1533
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2211
diff changeset
  1534
		netif_start_queue(netdev);
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2211
diff changeset
  1535
	}
1996
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1536
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1537
	/* fire a link status change interrupt to start the watchdog */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1538
	ew32(ICS, E1000_ICS_LSC);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1539
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1540
	return E1000_SUCCESS;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1541
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1542
err_req_irq:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1543
	e1000_release_hw_control(adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1544
	e1000_power_down_phy(adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1545
	e1000_free_all_rx_resources(adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1546
err_setup_rx:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1547
	e1000_free_all_tx_resources(adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1548
err_setup_tx:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1549
	e1000_reset(adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1550
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1551
	return err;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1552
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1553
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1554
/**
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1555
 * e1000_close - Disables a network interface
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1556
 * @netdev: network interface device structure
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1557
 *
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1558
 * Returns 0, this is not allowed to fail
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1559
 *
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1560
 * The close entry point is called when an interface is de-activated
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1561
 * by the OS.  The hardware is still under the drivers control, but
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1562
 * needs to be disabled.  A global MAC reset is issued to stop the
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1563
 * hardware, and all transmit and receive resources are freed.
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1564
 **/
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1565
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1566
static int e1000_close(struct net_device *netdev)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1567
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1568
	struct e1000_adapter *adapter = netdev_priv(netdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1569
	struct e1000_hw *hw = &adapter->hw;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1570
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1571
	WARN_ON(test_bit(__E1000_RESETTING, &adapter->flags));
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1572
	e1000_down(adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1573
	e1000_power_down_phy(adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1574
	e1000_free_irq(adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1575
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1576
	e1000_free_all_tx_resources(adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1577
	e1000_free_all_rx_resources(adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1578
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1579
	/* kill manageability vlan ID if supported, but not if a vlan with
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1580
	 * the same ID is registered on the host OS (let 8021q kill it) */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1581
	if ((hw->mng_cookie.status &
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1582
			  E1000_MNG_DHCP_COOKIE_STATUS_VLAN_SUPPORT) &&
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1583
	     !(adapter->vlgrp &&
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1584
	       vlan_group_get_device(adapter->vlgrp, adapter->mng_vlan_id))) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1585
		e1000_vlan_rx_kill_vid(netdev, adapter->mng_vlan_id);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1586
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1587
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1588
	/* If AMT is enabled, let the firmware know that the network
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1589
	 * interface is now closed */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1590
	if (hw->mac_type == e1000_82573 &&
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1591
	    e1000_check_mng_mode(hw))
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1592
		e1000_release_hw_control(adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1593
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1594
	return 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1595
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1596
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1597
/**
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1598
 * e1000_check_64k_bound - check that memory doesn't cross 64kB boundary
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1599
 * @adapter: address of board private structure
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1600
 * @start: address of beginning of memory
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1601
 * @len: length of memory
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1602
 **/
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1603
static bool e1000_check_64k_bound(struct e1000_adapter *adapter, void *start,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1604
				  unsigned long len)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1605
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1606
	struct e1000_hw *hw = &adapter->hw;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1607
	unsigned long begin = (unsigned long)start;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1608
	unsigned long end = begin + len;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1609
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1610
	/* First rev 82545 and 82546 need to not allow any memory
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1611
	 * write location to cross 64k boundary due to errata 23 */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1612
	if (hw->mac_type == e1000_82545 ||
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1613
	    hw->mac_type == e1000_82546) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1614
		return ((begin ^ (end - 1)) >> 16) != 0 ? false : true;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1615
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1616
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1617
	return true;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1618
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1619
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1620
/**
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1621
 * e1000_setup_tx_resources - allocate Tx resources (Descriptors)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1622
 * @adapter: board private structure
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1623
 * @txdr:    tx descriptor ring (for a specific queue) to setup
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1624
 *
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1625
 * Return 0 on success, negative on failure
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1626
 **/
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1627
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1628
static int e1000_setup_tx_resources(struct e1000_adapter *adapter,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1629
				    struct e1000_tx_ring *txdr)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1630
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1631
	struct pci_dev *pdev = adapter->pdev;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1632
	int size;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1633
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1634
	size = sizeof(struct e1000_buffer) * txdr->count;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1635
	txdr->buffer_info = vmalloc(size);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1636
	if (!txdr->buffer_info) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1637
		DPRINTK(PROBE, ERR,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1638
		"Unable to allocate memory for the transmit descriptor ring\n");
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1639
		return -ENOMEM;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1640
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1641
	memset(txdr->buffer_info, 0, size);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1642
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1643
	/* round up to nearest 4K */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1644
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1645
	txdr->size = txdr->count * sizeof(struct e1000_tx_desc);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1646
	txdr->size = ALIGN(txdr->size, 4096);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1647
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1648
	txdr->desc = pci_alloc_consistent(pdev, txdr->size, &txdr->dma);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1649
	if (!txdr->desc) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1650
setup_tx_desc_die:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1651
		vfree(txdr->buffer_info);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1652
		DPRINTK(PROBE, ERR,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1653
		"Unable to allocate memory for the transmit descriptor ring\n");
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1654
		return -ENOMEM;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1655
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1656
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1657
	/* Fix for errata 23, can't cross 64kB boundary */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1658
	if (!e1000_check_64k_bound(adapter, txdr->desc, txdr->size)) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1659
		void *olddesc = txdr->desc;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1660
		dma_addr_t olddma = txdr->dma;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1661
		DPRINTK(TX_ERR, ERR, "txdr align check failed: %u bytes "
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1662
				     "at %p\n", txdr->size, txdr->desc);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1663
		/* Try again, without freeing the previous */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1664
		txdr->desc = pci_alloc_consistent(pdev, txdr->size, &txdr->dma);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1665
		/* Failed allocation, critical failure */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1666
		if (!txdr->desc) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1667
			pci_free_consistent(pdev, txdr->size, olddesc, olddma);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1668
			goto setup_tx_desc_die;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1669
		}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1670
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1671
		if (!e1000_check_64k_bound(adapter, txdr->desc, txdr->size)) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1672
			/* give up */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1673
			pci_free_consistent(pdev, txdr->size, txdr->desc,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1674
					    txdr->dma);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1675
			pci_free_consistent(pdev, txdr->size, olddesc, olddma);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1676
			DPRINTK(PROBE, ERR,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1677
				"Unable to allocate aligned memory "
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1678
				"for the transmit descriptor ring\n");
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1679
			vfree(txdr->buffer_info);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1680
			return -ENOMEM;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1681
		} else {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1682
			/* Free old allocation, new allocation was successful */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1683
			pci_free_consistent(pdev, txdr->size, olddesc, olddma);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1684
		}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1685
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1686
	memset(txdr->desc, 0, txdr->size);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1687
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1688
	txdr->next_to_use = 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1689
	txdr->next_to_clean = 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1690
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1691
	return 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1692
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1693
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1694
/**
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1695
 * e1000_setup_all_tx_resources - wrapper to allocate Tx resources
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1696
 * 				  (Descriptors) for all queues
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1697
 * @adapter: board private structure
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1698
 *
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1699
 * Return 0 on success, negative on failure
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1700
 **/
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1701
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1702
int e1000_setup_all_tx_resources(struct e1000_adapter *adapter)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1703
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1704
	int i, err = 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1705
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1706
	for (i = 0; i < adapter->num_tx_queues; i++) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1707
		err = e1000_setup_tx_resources(adapter, &adapter->tx_ring[i]);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1708
		if (err) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1709
			DPRINTK(PROBE, ERR,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1710
				"Allocation for Tx Queue %u failed\n", i);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1711
			for (i-- ; i >= 0; i--)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1712
				e1000_free_tx_resources(adapter,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1713
							&adapter->tx_ring[i]);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1714
			break;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1715
		}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1716
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1717
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1718
	return err;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1719
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1720
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1721
/**
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1722
 * e1000_configure_tx - Configure 8254x Transmit Unit after Reset
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1723
 * @adapter: board private structure
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1724
 *
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1725
 * Configure the Tx unit of the MAC after a reset.
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1726
 **/
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1727
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1728
static void e1000_configure_tx(struct e1000_adapter *adapter)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1729
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1730
	u64 tdba;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1731
	struct e1000_hw *hw = &adapter->hw;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1732
	u32 tdlen, tctl, tipg, tarc;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1733
	u32 ipgr1, ipgr2;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1734
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1735
	/* Setup the HW Tx Head and Tail descriptor pointers */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1736
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1737
	switch (adapter->num_tx_queues) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1738
	case 1:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1739
	default:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1740
		tdba = adapter->tx_ring[0].dma;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1741
		tdlen = adapter->tx_ring[0].count *
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1742
			sizeof(struct e1000_tx_desc);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1743
		ew32(TDLEN, tdlen);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1744
		ew32(TDBAH, (tdba >> 32));
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1745
		ew32(TDBAL, (tdba & 0x00000000ffffffffULL));
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1746
		ew32(TDT, 0);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1747
		ew32(TDH, 0);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1748
		adapter->tx_ring[0].tdh = ((hw->mac_type >= e1000_82543) ? E1000_TDH : E1000_82542_TDH);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1749
		adapter->tx_ring[0].tdt = ((hw->mac_type >= e1000_82543) ? E1000_TDT : E1000_82542_TDT);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1750
		break;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1751
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1752
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1753
	/* Set the default values for the Tx Inter Packet Gap timer */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1754
	if (hw->mac_type <= e1000_82547_rev_2 &&
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1755
	    (hw->media_type == e1000_media_type_fiber ||
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1756
	     hw->media_type == e1000_media_type_internal_serdes))
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1757
		tipg = DEFAULT_82543_TIPG_IPGT_FIBER;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1758
	else
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1759
		tipg = DEFAULT_82543_TIPG_IPGT_COPPER;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1760
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1761
	switch (hw->mac_type) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1762
	case e1000_82542_rev2_0:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1763
	case e1000_82542_rev2_1:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1764
		tipg = DEFAULT_82542_TIPG_IPGT;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1765
		ipgr1 = DEFAULT_82542_TIPG_IPGR1;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1766
		ipgr2 = DEFAULT_82542_TIPG_IPGR2;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1767
		break;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1768
	case e1000_80003es2lan:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1769
		ipgr1 = DEFAULT_82543_TIPG_IPGR1;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1770
		ipgr2 = DEFAULT_80003ES2LAN_TIPG_IPGR2;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1771
		break;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1772
	default:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1773
		ipgr1 = DEFAULT_82543_TIPG_IPGR1;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1774
		ipgr2 = DEFAULT_82543_TIPG_IPGR2;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1775
		break;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1776
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1777
	tipg |= ipgr1 << E1000_TIPG_IPGR1_SHIFT;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1778
	tipg |= ipgr2 << E1000_TIPG_IPGR2_SHIFT;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1779
	ew32(TIPG, tipg);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1780
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1781
	/* Set the Tx Interrupt Delay register */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1782
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1783
	ew32(TIDV, adapter->tx_int_delay);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1784
	if (hw->mac_type >= e1000_82540)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1785
		ew32(TADV, adapter->tx_abs_int_delay);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1786
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1787
	/* Program the Transmit Control Register */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1788
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1789
	tctl = er32(TCTL);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1790
	tctl &= ~E1000_TCTL_CT;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1791
	tctl |= E1000_TCTL_PSP | E1000_TCTL_RTLC |
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1792
		(E1000_COLLISION_THRESHOLD << E1000_CT_SHIFT);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1793
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1794
	if (hw->mac_type == e1000_82571 || hw->mac_type == e1000_82572) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1795
		tarc = er32(TARC0);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1796
		/* set the speed mode bit, we'll clear it if we're not at
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1797
		 * gigabit link later */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1798
		tarc |= (1 << 21);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1799
		ew32(TARC0, tarc);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1800
	} else if (hw->mac_type == e1000_80003es2lan) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1801
		tarc = er32(TARC0);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1802
		tarc |= 1;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1803
		ew32(TARC0, tarc);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1804
		tarc = er32(TARC1);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1805
		tarc |= 1;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1806
		ew32(TARC1, tarc);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1807
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1808
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1809
	e1000_config_collision_dist(hw);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1810
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1811
	/* Setup Transmit Descriptor Settings for eop descriptor */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1812
	adapter->txd_cmd = E1000_TXD_CMD_EOP | E1000_TXD_CMD_IFCS;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1813
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1814
	/* only set IDE if we are delaying interrupts using the timers */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1815
	if (adapter->tx_int_delay)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1816
		adapter->txd_cmd |= E1000_TXD_CMD_IDE;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1817
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1818
	if (hw->mac_type < e1000_82543)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1819
		adapter->txd_cmd |= E1000_TXD_CMD_RPS;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1820
	else
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1821
		adapter->txd_cmd |= E1000_TXD_CMD_RS;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1822
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1823
	/* Cache if we're 82544 running in PCI-X because we'll
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1824
	 * need this to apply a workaround later in the send path. */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1825
	if (hw->mac_type == e1000_82544 &&
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1826
	    hw->bus_type == e1000_bus_type_pcix)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1827
		adapter->pcix_82544 = 1;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1828
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1829
	ew32(TCTL, tctl);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1830
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1831
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1832
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1833
/**
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1834
 * e1000_setup_rx_resources - allocate Rx resources (Descriptors)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1835
 * @adapter: board private structure
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1836
 * @rxdr:    rx descriptor ring (for a specific queue) to setup
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1837
 *
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1838
 * Returns 0 on success, negative on failure
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1839
 **/
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1840
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1841
static int e1000_setup_rx_resources(struct e1000_adapter *adapter,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1842
				    struct e1000_rx_ring *rxdr)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1843
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1844
	struct e1000_hw *hw = &adapter->hw;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1845
	struct pci_dev *pdev = adapter->pdev;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1846
	int size, desc_len;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1847
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1848
	size = sizeof(struct e1000_buffer) * rxdr->count;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1849
	rxdr->buffer_info = vmalloc(size);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1850
	if (!rxdr->buffer_info) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1851
		DPRINTK(PROBE, ERR,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1852
		"Unable to allocate memory for the receive descriptor ring\n");
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1853
		return -ENOMEM;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1854
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1855
	memset(rxdr->buffer_info, 0, size);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1856
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1857
	if (hw->mac_type <= e1000_82547_rev_2)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1858
		desc_len = sizeof(struct e1000_rx_desc);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1859
	else
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1860
		desc_len = sizeof(union e1000_rx_desc_packet_split);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1861
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1862
	/* Round up to nearest 4K */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1863
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1864
	rxdr->size = rxdr->count * desc_len;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1865
	rxdr->size = ALIGN(rxdr->size, 4096);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1866
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1867
	rxdr->desc = pci_alloc_consistent(pdev, rxdr->size, &rxdr->dma);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1868
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1869
	if (!rxdr->desc) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1870
		DPRINTK(PROBE, ERR,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1871
		"Unable to allocate memory for the receive descriptor ring\n");
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1872
setup_rx_desc_die:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1873
		vfree(rxdr->buffer_info);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1874
		return -ENOMEM;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1875
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1876
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1877
	/* Fix for errata 23, can't cross 64kB boundary */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1878
	if (!e1000_check_64k_bound(adapter, rxdr->desc, rxdr->size)) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1879
		void *olddesc = rxdr->desc;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1880
		dma_addr_t olddma = rxdr->dma;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1881
		DPRINTK(RX_ERR, ERR, "rxdr align check failed: %u bytes "
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1882
				     "at %p\n", rxdr->size, rxdr->desc);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1883
		/* Try again, without freeing the previous */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1884
		rxdr->desc = pci_alloc_consistent(pdev, rxdr->size, &rxdr->dma);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1885
		/* Failed allocation, critical failure */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1886
		if (!rxdr->desc) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1887
			pci_free_consistent(pdev, rxdr->size, olddesc, olddma);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1888
			DPRINTK(PROBE, ERR,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1889
				"Unable to allocate memory "
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1890
				"for the receive descriptor ring\n");
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1891
			goto setup_rx_desc_die;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1892
		}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1893
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1894
		if (!e1000_check_64k_bound(adapter, rxdr->desc, rxdr->size)) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1895
			/* give up */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1896
			pci_free_consistent(pdev, rxdr->size, rxdr->desc,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1897
					    rxdr->dma);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1898
			pci_free_consistent(pdev, rxdr->size, olddesc, olddma);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1899
			DPRINTK(PROBE, ERR,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1900
				"Unable to allocate aligned memory "
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1901
				"for the receive descriptor ring\n");
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1902
			goto setup_rx_desc_die;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1903
		} else {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1904
			/* Free old allocation, new allocation was successful */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1905
			pci_free_consistent(pdev, rxdr->size, olddesc, olddma);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1906
		}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1907
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1908
	memset(rxdr->desc, 0, rxdr->size);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1909
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1910
	rxdr->next_to_clean = 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1911
	rxdr->next_to_use = 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1912
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1913
	return 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1914
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1915
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1916
/**
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1917
 * e1000_setup_all_rx_resources - wrapper to allocate Rx resources
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1918
 * 				  (Descriptors) for all queues
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1919
 * @adapter: board private structure
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1920
 *
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1921
 * Return 0 on success, negative on failure
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1922
 **/
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1923
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1924
int e1000_setup_all_rx_resources(struct e1000_adapter *adapter)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1925
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1926
	int i, err = 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1927
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1928
	for (i = 0; i < adapter->num_rx_queues; i++) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1929
		err = e1000_setup_rx_resources(adapter, &adapter->rx_ring[i]);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1930
		if (err) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1931
			DPRINTK(PROBE, ERR,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1932
				"Allocation for Rx Queue %u failed\n", i);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1933
			for (i-- ; i >= 0; i--)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1934
				e1000_free_rx_resources(adapter,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1935
							&adapter->rx_ring[i]);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1936
			break;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1937
		}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1938
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1939
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1940
	return err;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1941
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1942
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1943
/**
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1944
 * e1000_setup_rctl - configure the receive control registers
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1945
 * @adapter: Board private structure
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1946
 **/
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1947
static void e1000_setup_rctl(struct e1000_adapter *adapter)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1948
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1949
	struct e1000_hw *hw = &adapter->hw;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1950
	u32 rctl;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1951
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1952
	rctl = er32(RCTL);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1953
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1954
	rctl &= ~(3 << E1000_RCTL_MO_SHIFT);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1955
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1956
	rctl |= E1000_RCTL_EN | E1000_RCTL_BAM |
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1957
		E1000_RCTL_LBM_NO | E1000_RCTL_RDMTS_HALF |
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1958
		(hw->mc_filter_type << E1000_RCTL_MO_SHIFT);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1959
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1960
	if (hw->tbi_compatibility_on == 1)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1961
		rctl |= E1000_RCTL_SBP;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1962
	else
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1963
		rctl &= ~E1000_RCTL_SBP;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1964
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1965
	if (adapter->netdev->mtu <= ETH_DATA_LEN)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1966
		rctl &= ~E1000_RCTL_LPE;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1967
	else
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1968
		rctl |= E1000_RCTL_LPE;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1969
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1970
	/* Setup buffer sizes */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1971
	rctl &= ~E1000_RCTL_SZ_4096;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1972
	rctl |= E1000_RCTL_BSEX;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1973
	switch (adapter->rx_buffer_len) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1974
		case E1000_RXBUFFER_256:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1975
			rctl |= E1000_RCTL_SZ_256;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1976
			rctl &= ~E1000_RCTL_BSEX;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1977
			break;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1978
		case E1000_RXBUFFER_512:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1979
			rctl |= E1000_RCTL_SZ_512;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1980
			rctl &= ~E1000_RCTL_BSEX;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1981
			break;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1982
		case E1000_RXBUFFER_1024:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1983
			rctl |= E1000_RCTL_SZ_1024;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1984
			rctl &= ~E1000_RCTL_BSEX;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1985
			break;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1986
		case E1000_RXBUFFER_2048:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1987
		default:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1988
			rctl |= E1000_RCTL_SZ_2048;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1989
			rctl &= ~E1000_RCTL_BSEX;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1990
			break;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1991
		case E1000_RXBUFFER_4096:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1992
			rctl |= E1000_RCTL_SZ_4096;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1993
			break;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1994
		case E1000_RXBUFFER_8192:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1995
			rctl |= E1000_RCTL_SZ_8192;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1996
			break;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1997
		case E1000_RXBUFFER_16384:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1998
			rctl |= E1000_RCTL_SZ_16384;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1999
			break;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2000
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2001
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2002
	ew32(RCTL, rctl);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2003
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2004
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2005
/**
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2006
 * e1000_configure_rx - Configure 8254x Receive Unit after Reset
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2007
 * @adapter: board private structure
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2008
 *
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2009
 * Configure the Rx unit of the MAC after a reset.
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2010
 **/
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2011
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2012
static void e1000_configure_rx(struct e1000_adapter *adapter)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2013
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2014
	u64 rdba;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2015
	struct e1000_hw *hw = &adapter->hw;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2016
	u32 rdlen, rctl, rxcsum, ctrl_ext;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2017
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2018
	rdlen = adapter->rx_ring[0].count *
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2019
		sizeof(struct e1000_rx_desc);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2020
	adapter->clean_rx = e1000_clean_rx_irq;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2021
	adapter->alloc_rx_buf = e1000_alloc_rx_buffers;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2022
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2023
	/* disable receives while setting up the descriptors */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2024
	rctl = er32(RCTL);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2025
	ew32(RCTL, rctl & ~E1000_RCTL_EN);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2026
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2027
	/* set the Receive Delay Timer Register */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2028
	ew32(RDTR, adapter->rx_int_delay);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2029
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2030
	if (hw->mac_type >= e1000_82540) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2031
		ew32(RADV, adapter->rx_abs_int_delay);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2032
		if (adapter->itr_setting != 0)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2033
			ew32(ITR, 1000000000 / (adapter->itr * 256));
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2034
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2035
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2036
	if (hw->mac_type >= e1000_82571) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2037
		ctrl_ext = er32(CTRL_EXT);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2038
		/* Reset delay timers after every interrupt */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2039
		ctrl_ext |= E1000_CTRL_EXT_INT_TIMER_CLR;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2040
		/* Auto-Mask interrupts upon ICR access */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2041
		ctrl_ext |= E1000_CTRL_EXT_IAME;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2042
		ew32(IAM, 0xffffffff);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2043
		ew32(CTRL_EXT, ctrl_ext);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2044
		E1000_WRITE_FLUSH();
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2045
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2046
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2047
	/* Setup the HW Rx Head and Tail Descriptor Pointers and
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2048
	 * the Base and Length of the Rx Descriptor Ring */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2049
	switch (adapter->num_rx_queues) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2050
	case 1:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2051
	default:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2052
		rdba = adapter->rx_ring[0].dma;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2053
		ew32(RDLEN, rdlen);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2054
		ew32(RDBAH, (rdba >> 32));
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2055
		ew32(RDBAL, (rdba & 0x00000000ffffffffULL));
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2056
		ew32(RDT, 0);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2057
		ew32(RDH, 0);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2058
		adapter->rx_ring[0].rdh = ((hw->mac_type >= e1000_82543) ? E1000_RDH : E1000_82542_RDH);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2059
		adapter->rx_ring[0].rdt = ((hw->mac_type >= e1000_82543) ? E1000_RDT : E1000_82542_RDT);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2060
		break;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2061
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2062
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2063
	/* Enable 82543 Receive Checksum Offload for TCP and UDP */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2064
	if (hw->mac_type >= e1000_82543) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2065
		rxcsum = er32(RXCSUM);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2066
		if (adapter->rx_csum)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2067
			rxcsum |= E1000_RXCSUM_TUOFL;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2068
		else
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2069
			/* don't need to clear IPPCSE as it defaults to 0 */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2070
			rxcsum &= ~E1000_RXCSUM_TUOFL;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2071
		ew32(RXCSUM, rxcsum);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2072
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2073
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2074
	/* Enable Receives */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2075
	ew32(RCTL, rctl);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2076
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2077
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2078
/**
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2079
 * e1000_free_tx_resources - Free Tx Resources per Queue
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2080
 * @adapter: board private structure
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2081
 * @tx_ring: Tx descriptor ring for a specific queue
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2082
 *
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2083
 * Free all transmit software resources
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2084
 **/
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2085
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2086
static void e1000_free_tx_resources(struct e1000_adapter *adapter,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2087
				    struct e1000_tx_ring *tx_ring)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2088
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2089
	struct pci_dev *pdev = adapter->pdev;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2090
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2091
	e1000_clean_tx_ring(adapter, tx_ring);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2092
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2093
	vfree(tx_ring->buffer_info);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2094
	tx_ring->buffer_info = NULL;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2095
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2096
	pci_free_consistent(pdev, tx_ring->size, tx_ring->desc, tx_ring->dma);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2097
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2098
	tx_ring->desc = NULL;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2099
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2100
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2101
/**
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2102
 * e1000_free_all_tx_resources - Free Tx Resources for All Queues
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2103
 * @adapter: board private structure
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2104
 *
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2105
 * Free all transmit software resources
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2106
 **/
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2107
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2108
void e1000_free_all_tx_resources(struct e1000_adapter *adapter)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2109
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2110
	int i;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2111
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2112
	for (i = 0; i < adapter->num_tx_queues; i++)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2113
		e1000_free_tx_resources(adapter, &adapter->tx_ring[i]);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2114
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2115
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2116
static void e1000_unmap_and_free_tx_resource(struct e1000_adapter *adapter,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2117
					     struct e1000_buffer *buffer_info)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2118
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2119
	if (adapter->ecdev)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2120
		return;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2121
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2122
	buffer_info->dma = 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2123
	if (buffer_info->skb) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2124
		skb_dma_unmap(&adapter->pdev->dev, buffer_info->skb,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2125
		              DMA_TO_DEVICE);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2126
		dev_kfree_skb_any(buffer_info->skb);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2127
		buffer_info->skb = NULL;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2128
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2129
	buffer_info->time_stamp = 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2130
	/* buffer_info must be completely set up in the transmit path */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2131
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2132
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2133
/**
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2134
 * e1000_clean_tx_ring - Free Tx Buffers
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2135
 * @adapter: board private structure
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2136
 * @tx_ring: ring to be cleaned
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2137
 **/
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2138
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2139
static void e1000_clean_tx_ring(struct e1000_adapter *adapter,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2140
				struct e1000_tx_ring *tx_ring)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2141
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2142
	struct e1000_hw *hw = &adapter->hw;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2143
	struct e1000_buffer *buffer_info;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2144
	unsigned long size;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2145
	unsigned int i;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2146
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2147
	/* Free all the Tx ring sk_buffs */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2148
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2149
	for (i = 0; i < tx_ring->count; i++) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2150
		buffer_info = &tx_ring->buffer_info[i];
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2151
		e1000_unmap_and_free_tx_resource(adapter, buffer_info);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2152
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2153
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2154
	size = sizeof(struct e1000_buffer) * tx_ring->count;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2155
	memset(tx_ring->buffer_info, 0, size);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2156
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2157
	/* Zero out the descriptor ring */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2158
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2159
	memset(tx_ring->desc, 0, tx_ring->size);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2160
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2161
	tx_ring->next_to_use = 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2162
	tx_ring->next_to_clean = 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2163
	tx_ring->last_tx_tso = 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2164
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2165
	writel(0, hw->hw_addr + tx_ring->tdh);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2166
	writel(0, hw->hw_addr + tx_ring->tdt);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2167
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2168
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2169
/**
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2170
 * e1000_clean_all_tx_rings - Free Tx Buffers for all queues
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2171
 * @adapter: board private structure
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2172
 **/
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2173
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2174
static void e1000_clean_all_tx_rings(struct e1000_adapter *adapter)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2175
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2176
	int i;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2177
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2178
	for (i = 0; i < adapter->num_tx_queues; i++)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2179
		e1000_clean_tx_ring(adapter, &adapter->tx_ring[i]);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2180
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2181
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2182
/**
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2183
 * e1000_free_rx_resources - Free Rx Resources
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2184
 * @adapter: board private structure
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2185
 * @rx_ring: ring to clean the resources from
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2186
 *
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2187
 * Free all receive software resources
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2188
 **/
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2189
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2190
static void e1000_free_rx_resources(struct e1000_adapter *adapter,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2191
				    struct e1000_rx_ring *rx_ring)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2192
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2193
	struct pci_dev *pdev = adapter->pdev;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2194
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2195
	e1000_clean_rx_ring(adapter, rx_ring);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2196
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2197
	vfree(rx_ring->buffer_info);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2198
	rx_ring->buffer_info = NULL;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2199
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2200
	pci_free_consistent(pdev, rx_ring->size, rx_ring->desc, rx_ring->dma);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2201
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2202
	rx_ring->desc = NULL;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2203
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2204
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2205
/**
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2206
 * e1000_free_all_rx_resources - Free Rx Resources for All Queues
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2207
 * @adapter: board private structure
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2208
 *
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2209
 * Free all receive software resources
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2210
 **/
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2211
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2212
void e1000_free_all_rx_resources(struct e1000_adapter *adapter)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2213
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2214
	int i;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2215
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2216
	for (i = 0; i < adapter->num_rx_queues; i++)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2217
		e1000_free_rx_resources(adapter, &adapter->rx_ring[i]);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2218
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2219
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2220
/**
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2221
 * e1000_clean_rx_ring - Free Rx Buffers per Queue
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2222
 * @adapter: board private structure
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2223
 * @rx_ring: ring to free buffers from
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2224
 **/
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2225
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2226
static void e1000_clean_rx_ring(struct e1000_adapter *adapter,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2227
				struct e1000_rx_ring *rx_ring)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2228
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2229
	struct e1000_hw *hw = &adapter->hw;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2230
	struct e1000_buffer *buffer_info;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2231
	struct pci_dev *pdev = adapter->pdev;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2232
	unsigned long size;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2233
	unsigned int i;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2234
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2235
	/* Free all the Rx ring sk_buffs */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2236
	for (i = 0; i < rx_ring->count; i++) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2237
		buffer_info = &rx_ring->buffer_info[i];
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2238
		if (buffer_info->dma) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2239
			pci_unmap_single(pdev,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2240
					 buffer_info->dma,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2241
					 buffer_info->length,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2242
					 PCI_DMA_FROMDEVICE);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2243
		}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2244
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2245
		buffer_info->dma = 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2246
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2247
		if (buffer_info->skb) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2248
			dev_kfree_skb(buffer_info->skb);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2249
			buffer_info->skb = NULL;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2250
		}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2251
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2252
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2253
	size = sizeof(struct e1000_buffer) * rx_ring->count;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2254
	memset(rx_ring->buffer_info, 0, size);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2255
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2256
	/* Zero out the descriptor ring */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2257
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2258
	memset(rx_ring->desc, 0, rx_ring->size);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2259
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2260
	rx_ring->next_to_clean = 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2261
	rx_ring->next_to_use = 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2262
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2263
	writel(0, hw->hw_addr + rx_ring->rdh);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2264
	writel(0, hw->hw_addr + rx_ring->rdt);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2265
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2266
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2267
/**
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2268
 * e1000_clean_all_rx_rings - Free Rx Buffers for all queues
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2269
 * @adapter: board private structure
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2270
 **/
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2271
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2272
static void e1000_clean_all_rx_rings(struct e1000_adapter *adapter)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2273
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2274
	int i;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2275
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2276
	for (i = 0; i < adapter->num_rx_queues; i++)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2277
		e1000_clean_rx_ring(adapter, &adapter->rx_ring[i]);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2278
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2279
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2280
/* The 82542 2.0 (revision 2) needs to have the receive unit in reset
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2281
 * and memory write and invalidate disabled for certain operations
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2282
 */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2283
static void e1000_enter_82542_rst(struct e1000_adapter *adapter)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2284
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2285
	struct e1000_hw *hw = &adapter->hw;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2286
	struct net_device *netdev = adapter->netdev;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2287
	u32 rctl;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2288
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2289
	e1000_pci_clear_mwi(hw);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2290
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2291
	rctl = er32(RCTL);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2292
	rctl |= E1000_RCTL_RST;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2293
	ew32(RCTL, rctl);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2294
	E1000_WRITE_FLUSH();
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2295
	mdelay(5);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2296
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2297
	if (!adapter->ecdev && netif_running(netdev))
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2298
		e1000_clean_all_rx_rings(adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2299
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2300
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2301
static void e1000_leave_82542_rst(struct e1000_adapter *adapter)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2302
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2303
	struct e1000_hw *hw = &adapter->hw;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2304
	struct net_device *netdev = adapter->netdev;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2305
	u32 rctl;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2306
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2307
	rctl = er32(RCTL);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2308
	rctl &= ~E1000_RCTL_RST;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2309
	ew32(RCTL, rctl);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2310
	E1000_WRITE_FLUSH();
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2311
	mdelay(5);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2312
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2313
	if (hw->pci_cmd_word & PCI_COMMAND_INVALIDATE)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2314
		e1000_pci_set_mwi(hw);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2315
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2316
	if (!adapter->netdev && netif_running(netdev)) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2317
		/* No need to loop, because 82542 supports only 1 queue */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2318
		struct e1000_rx_ring *ring = &adapter->rx_ring[0];
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2319
		e1000_configure_rx(adapter);
2589
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2211
diff changeset
  2320
		if (adapter->ecdev) {
1996
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2321
			/* fill rx ring completely! */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2322
			adapter->alloc_rx_buf(adapter, ring, ring->count);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2323
		} else {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2324
            /* this one leaves the last ring element unallocated! */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2325
			adapter->alloc_rx_buf(adapter, ring, E1000_DESC_UNUSED(ring));
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2326
		}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2327
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2328
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2329
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2330
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2331
/**
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2332
 * e1000_set_mac - Change the Ethernet Address of the NIC
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2333
 * @netdev: network interface device structure
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2334
 * @p: pointer to an address structure
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2335
 *
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2336
 * Returns 0 on success, negative on failure
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2337
 **/
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2338
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2339
static int e1000_set_mac(struct net_device *netdev, void *p)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2340
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2341
	struct e1000_adapter *adapter = netdev_priv(netdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2342
	struct e1000_hw *hw = &adapter->hw;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2343
	struct sockaddr *addr = p;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2344
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2345
	if (!is_valid_ether_addr(addr->sa_data))
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2346
		return -EADDRNOTAVAIL;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2347
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2348
	/* 82542 2.0 needs to be in reset to write receive address registers */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2349
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2350
	if (hw->mac_type == e1000_82542_rev2_0)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2351
		e1000_enter_82542_rst(adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2352
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2353
	memcpy(netdev->dev_addr, addr->sa_data, netdev->addr_len);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2354
	memcpy(hw->mac_addr, addr->sa_data, netdev->addr_len);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2355
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2356
	e1000_rar_set(hw, hw->mac_addr, 0);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2357
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2358
	/* With 82571 controllers, LAA may be overwritten (with the default)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2359
	 * due to controller reset from the other port. */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2360
	if (hw->mac_type == e1000_82571) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2361
		/* activate the work around */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2362
		hw->laa_is_present = 1;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2363
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2364
		/* Hold a copy of the LAA in RAR[14] This is done so that
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2365
		 * between the time RAR[0] gets clobbered  and the time it
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2366
		 * gets fixed (in e1000_watchdog), the actual LAA is in one
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2367
		 * of the RARs and no incoming packets directed to this port
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2368
		 * are dropped. Eventaully the LAA will be in RAR[0] and
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2369
		 * RAR[14] */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2370
		e1000_rar_set(hw, hw->mac_addr,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2371
					E1000_RAR_ENTRIES - 1);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2372
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2373
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2374
	if (hw->mac_type == e1000_82542_rev2_0)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2375
		e1000_leave_82542_rst(adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2376
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2377
	return 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2378
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2379
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2380
/**
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2381
 * e1000_set_rx_mode - Secondary Unicast, Multicast and Promiscuous mode set
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2382
 * @netdev: network interface device structure
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2383
 *
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2384
 * The set_rx_mode entry point is called whenever the unicast or multicast
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2385
 * address lists or the network interface flags are updated. This routine is
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2386
 * responsible for configuring the hardware for proper unicast, multicast,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2387
 * promiscuous mode, and all-multi behavior.
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2388
 **/
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2389
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2390
static void e1000_set_rx_mode(struct net_device *netdev)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2391
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2392
	struct e1000_adapter *adapter = netdev_priv(netdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2393
	struct e1000_hw *hw = &adapter->hw;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2394
	struct netdev_hw_addr *ha;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2395
	bool use_uc = false;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2396
	struct dev_addr_list *mc_ptr;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2397
	u32 rctl;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2398
	u32 hash_value;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2399
	int i, rar_entries = E1000_RAR_ENTRIES;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2400
	int mta_reg_count = (hw->mac_type == e1000_ich8lan) ?
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2401
				E1000_NUM_MTA_REGISTERS_ICH8LAN :
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2402
				E1000_NUM_MTA_REGISTERS;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2403
	u32 *mcarray = kcalloc(mta_reg_count, sizeof(u32), GFP_ATOMIC);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2404
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2405
	if (!mcarray) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2406
		DPRINTK(PROBE, ERR, "memory allocation failed\n");
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2407
		return;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2408
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2409
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2410
	if (hw->mac_type == e1000_ich8lan)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2411
		rar_entries = E1000_RAR_ENTRIES_ICH8LAN;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2412
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2413
	/* reserve RAR[14] for LAA over-write work-around */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2414
	if (hw->mac_type == e1000_82571)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2415
		rar_entries--;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2416
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2417
	/* Check for Promiscuous and All Multicast modes */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2418
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2419
	rctl = er32(RCTL);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2420
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2421
	if (netdev->flags & IFF_PROMISC) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2422
		rctl |= (E1000_RCTL_UPE | E1000_RCTL_MPE);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2423
		rctl &= ~E1000_RCTL_VFE;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2424
	} else {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2425
		if (netdev->flags & IFF_ALLMULTI) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2426
			rctl |= E1000_RCTL_MPE;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2427
		} else {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2428
			rctl &= ~E1000_RCTL_MPE;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2429
		}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2430
		if (adapter->hw.mac_type != e1000_ich8lan)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2431
			rctl |= E1000_RCTL_VFE;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2432
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2433
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2434
	if (netdev->uc.count > rar_entries - 1) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2435
		rctl |= E1000_RCTL_UPE;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2436
	} else if (!(netdev->flags & IFF_PROMISC)) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2437
		rctl &= ~E1000_RCTL_UPE;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2438
		use_uc = true;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2439
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2440
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2441
	ew32(RCTL, rctl);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2442
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2443
	/* 82542 2.0 needs to be in reset to write receive address registers */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2444
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2445
	if (hw->mac_type == e1000_82542_rev2_0)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2446
		e1000_enter_82542_rst(adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2447
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2448
	/* load the first 14 addresses into the exact filters 1-14. Unicast
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2449
	 * addresses take precedence to avoid disabling unicast filtering
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2450
	 * when possible.
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2451
	 *
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2452
	 * RAR 0 is used for the station MAC adddress
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2453
	 * if there are not 14 addresses, go ahead and clear the filters
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2454
	 * -- with 82571 controllers only 0-13 entries are filled here
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2455
	 */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2456
	i = 1;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2457
	if (use_uc)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2458
		list_for_each_entry(ha, &netdev->uc.list, list) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2459
			if (i == rar_entries)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2460
				break;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2461
			e1000_rar_set(hw, ha->addr, i++);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2462
		}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2463
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2464
	WARN_ON(i == rar_entries);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2465
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2466
	mc_ptr = netdev->mc_list;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2467
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2468
	for (; i < rar_entries; i++) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2469
		if (mc_ptr) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2470
			e1000_rar_set(hw, mc_ptr->da_addr, i);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2471
			mc_ptr = mc_ptr->next;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2472
		} else {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2473
			E1000_WRITE_REG_ARRAY(hw, RA, i << 1, 0);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2474
			E1000_WRITE_FLUSH();
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2475
			E1000_WRITE_REG_ARRAY(hw, RA, (i << 1) + 1, 0);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2476
			E1000_WRITE_FLUSH();
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2477
		}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2478
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2479
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2480
	/* load any remaining addresses into the hash table */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2481
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2482
	for (; mc_ptr; mc_ptr = mc_ptr->next) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2483
		u32 hash_reg, hash_bit, mta;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2484
		hash_value = e1000_hash_mc_addr(hw, mc_ptr->da_addr);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2485
		hash_reg = (hash_value >> 5) & 0x7F;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2486
		hash_bit = hash_value & 0x1F;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2487
		mta = (1 << hash_bit);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2488
		mcarray[hash_reg] |= mta;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2489
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2490
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2491
	/* write the hash table completely, write from bottom to avoid
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2492
	 * both stupid write combining chipsets, and flushing each write */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2493
	for (i = mta_reg_count - 1; i >= 0 ; i--) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2494
		/*
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2495
		 * If we are on an 82544 has an errata where writing odd
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2496
		 * offsets overwrites the previous even offset, but writing
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2497
		 * backwards over the range solves the issue by always
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2498
		 * writing the odd offset first
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2499
		 */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2500
		E1000_WRITE_REG_ARRAY(hw, MTA, i, mcarray[i]);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2501
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2502
	E1000_WRITE_FLUSH();
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2503
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2504
	if (hw->mac_type == e1000_82542_rev2_0)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2505
		e1000_leave_82542_rst(adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2506
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2507
	kfree(mcarray);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2508
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2509
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2510
/* Need to wait a few seconds after link up to get diagnostic information from
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2511
 * the phy */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2512
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2513
static void e1000_update_phy_info(unsigned long data)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2514
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2515
	struct e1000_adapter *adapter = (struct e1000_adapter *)data;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2516
	struct e1000_hw *hw = &adapter->hw;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2517
	e1000_phy_get_info(hw, &adapter->phy_info);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2518
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2519
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2520
/**
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2521
 * e1000_82547_tx_fifo_stall - Timer Call-back
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2522
 * @data: pointer to adapter cast into an unsigned long
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2523
 **/
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2524
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2525
static void e1000_82547_tx_fifo_stall(unsigned long data)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2526
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2527
	struct e1000_adapter *adapter = (struct e1000_adapter *)data;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2528
	struct e1000_hw *hw = &adapter->hw;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2529
	struct net_device *netdev = adapter->netdev;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2530
	u32 tctl;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2531
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2532
	if (atomic_read(&adapter->tx_fifo_stall)) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2533
		if ((er32(TDT) == er32(TDH)) &&
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2534
		   (er32(TDFT) == er32(TDFH)) &&
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2535
		   (er32(TDFTS) == er32(TDFHS))) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2536
			tctl = er32(TCTL);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2537
			ew32(TCTL, tctl & ~E1000_TCTL_EN);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2538
			ew32(TDFT, adapter->tx_head_addr);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2539
			ew32(TDFH, adapter->tx_head_addr);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2540
			ew32(TDFTS, adapter->tx_head_addr);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2541
			ew32(TDFHS, adapter->tx_head_addr);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2542
			ew32(TCTL, tctl);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2543
			E1000_WRITE_FLUSH();
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2544
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2545
			adapter->tx_fifo_head = 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2546
			atomic_set(&adapter->tx_fifo_stall, 0);
2589
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2211
diff changeset
  2547
			if (!adapter->ecdev)
1996
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2548
				netif_wake_queue(netdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2549
		} else {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2550
			if (!adapter->ecdev)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2551
				mod_timer(&adapter->tx_fifo_stall_timer, jiffies + 1);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2552
		}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2553
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2554
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2555
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2556
/**
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2557
 * e1000_watchdog - Timer Call-back
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2558
 * @data: pointer to adapter cast into an unsigned long
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2559
 **/
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2560
static void e1000_watchdog(unsigned long data)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2561
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2562
	struct e1000_adapter *adapter = (struct e1000_adapter *)data;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2563
	struct e1000_hw *hw = &adapter->hw;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2564
	struct net_device *netdev = adapter->netdev;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2565
	struct e1000_tx_ring *txdr = adapter->tx_ring;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2566
	u32 link, tctl;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2567
	s32 ret_val;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2568
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2569
	ret_val = e1000_check_for_link(hw);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2570
	if ((ret_val == E1000_ERR_PHY) &&
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2571
	    (hw->phy_type == e1000_phy_igp_3) &&
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2572
	    (er32(CTRL) & E1000_PHY_CTRL_GBE_DISABLE)) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2573
		/* See e1000_kumeran_lock_loss_workaround() */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2574
		DPRINTK(LINK, INFO,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2575
			"Gigabit has been disabled, downgrading speed\n");
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2576
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2577
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2578
	if (hw->mac_type == e1000_82573) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2579
		e1000_enable_tx_pkt_filtering(hw);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2580
		if (adapter->mng_vlan_id != hw->mng_cookie.vlan_id)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2581
			e1000_update_mng_vlan(adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2582
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2583
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2584
	if ((hw->media_type == e1000_media_type_internal_serdes) &&
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2585
	   !(er32(TXCW) & E1000_TXCW_ANE))
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2586
		link = !hw->serdes_link_down;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2587
	else
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2588
		link = er32(STATUS) & E1000_STATUS_LU;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2589
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2590
	if (link) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2591
		if ( (adapter->ecdev && !ecdev_get_link(adapter->ecdev))
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2592
				|| (!adapter->ecdev && !netif_carrier_ok(netdev)) ) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2593
			u32 ctrl;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2594
			bool txb2b = true;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2595
			e1000_get_speed_and_duplex(hw,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2596
			                           &adapter->link_speed,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2597
			                           &adapter->link_duplex);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2598
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2599
			ctrl = er32(CTRL);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2600
			printk(KERN_INFO "e1000: %s NIC Link is Up %d Mbps %s, "
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2601
			       "Flow Control: %s\n",
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2602
			       netdev->name,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2603
			       adapter->link_speed,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2604
			       adapter->link_duplex == FULL_DUPLEX ?
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2605
			        "Full Duplex" : "Half Duplex",
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2606
			        ((ctrl & E1000_CTRL_TFCE) && (ctrl &
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2607
			        E1000_CTRL_RFCE)) ? "RX/TX" : ((ctrl &
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2608
			        E1000_CTRL_RFCE) ? "RX" : ((ctrl &
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2609
			        E1000_CTRL_TFCE) ? "TX" : "None" )));
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2610
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2611
			/* tweak tx_queue_len according to speed/duplex
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2612
			 * and adjust the timeout factor */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2613
			netdev->tx_queue_len = adapter->tx_queue_len;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2614
			adapter->tx_timeout_factor = 1;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2615
			switch (adapter->link_speed) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2616
			case SPEED_10:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2617
				txb2b = false;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2618
				netdev->tx_queue_len = 10;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2619
				adapter->tx_timeout_factor = 8;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2620
				break;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2621
			case SPEED_100:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2622
				txb2b = false;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2623
				netdev->tx_queue_len = 100;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2624
				/* maybe add some timeout factor ? */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2625
				break;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2626
			}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2627
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2628
			if ((hw->mac_type == e1000_82571 ||
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2629
			     hw->mac_type == e1000_82572) &&
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2630
			    !txb2b) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2631
				u32 tarc0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2632
				tarc0 = er32(TARC0);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2633
				tarc0 &= ~(1 << 21);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2634
				ew32(TARC0, tarc0);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2635
			}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2636
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2637
			/* disable TSO for pcie and 10/100 speeds, to avoid
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2638
			 * some hardware issues */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2639
			if (!adapter->tso_force &&
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2640
			    hw->bus_type == e1000_bus_type_pci_express){
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2641
				switch (adapter->link_speed) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2642
				case SPEED_10:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2643
				case SPEED_100:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2644
					DPRINTK(PROBE,INFO,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2645
				        "10/100 speed: disabling TSO\n");
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2646
					netdev->features &= ~NETIF_F_TSO;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2647
					netdev->features &= ~NETIF_F_TSO6;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2648
					break;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2649
				case SPEED_1000:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2650
					netdev->features |= NETIF_F_TSO;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2651
					netdev->features |= NETIF_F_TSO6;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2652
					break;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2653
				default:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2654
					/* oops */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2655
					break;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2656
				}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2657
			}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2658
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2659
			/* enable transmits in the hardware, need to do this
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2660
			 * after setting TARC0 */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2661
			tctl = er32(TCTL);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2662
			tctl |= E1000_TCTL_EN;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2663
			ew32(TCTL, tctl);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2664
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2665
			if (adapter->ecdev) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2666
				ecdev_set_link(adapter->ecdev, 1);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2667
			} else {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2668
				netif_carrier_on(netdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2669
				mod_timer(&adapter->phy_info_timer, round_jiffies(jiffies + 2 * HZ));
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2670
			}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2671
			adapter->smartspeed = 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2672
		} else {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2673
			/* make sure the receive unit is started */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2674
			if (hw->rx_needs_kicking) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2675
				u32 rctl = er32(RCTL);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2676
				ew32(RCTL, rctl | E1000_RCTL_EN);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2677
			}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2678
		}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2679
	} else {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2680
		if ( (adapter->ecdev && ecdev_get_link(adapter->ecdev))
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2681
				|| (!adapter->ecdev && netif_carrier_ok(netdev)) ) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2682
			adapter->link_speed = 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2683
			adapter->link_duplex = 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2684
			printk(KERN_INFO "e1000: %s NIC Link is Down\n",
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2685
			       netdev->name);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2686
			if (adapter->ecdev) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2687
				ecdev_set_link(adapter->ecdev, 0);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2688
			} else {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2689
				netif_carrier_off(netdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2690
				mod_timer(&adapter->phy_info_timer, round_jiffies(jiffies + 2 * HZ));
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2691
			}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2692
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2693
			/* 80003ES2LAN workaround--
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2694
			 * For packet buffer work-around on link down event;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2695
			 * disable receives in the ISR and
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2696
			 * reset device here in the watchdog
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2697
			 */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2698
			if (hw->mac_type == e1000_80003es2lan)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2699
				/* reset device */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2700
				schedule_work(&adapter->reset_task);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2701
		}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2702
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2703
		e1000_smartspeed(adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2704
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2705
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2706
	e1000_update_stats(adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2707
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2708
	hw->tx_packet_delta = adapter->stats.tpt - adapter->tpt_old;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2709
	adapter->tpt_old = adapter->stats.tpt;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2710
	hw->collision_delta = adapter->stats.colc - adapter->colc_old;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2711
	adapter->colc_old = adapter->stats.colc;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2712
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2713
	adapter->gorcl = adapter->stats.gorcl - adapter->gorcl_old;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2714
	adapter->gorcl_old = adapter->stats.gorcl;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2715
	adapter->gotcl = adapter->stats.gotcl - adapter->gotcl_old;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2716
	adapter->gotcl_old = adapter->stats.gotcl;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2717
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2718
	e1000_update_adaptive(hw);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2719
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2720
	if (!adapter->ecdev && !netif_carrier_ok(netdev)) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2721
		if (E1000_DESC_UNUSED(txdr) + 1 < txdr->count) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2722
			/* We've lost link, so the controller stops DMA,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2723
			 * but we've got queued Tx work that's never going
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2724
			 * to get done, so reset controller to flush Tx.
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2725
			 * (Do the reset outside of interrupt context). */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2726
			adapter->tx_timeout_count++;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2727
			schedule_work(&adapter->reset_task);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2728
			/* return immediately since reset is imminent */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2729
			return;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2730
		}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2731
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2732
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2733
	/* Cause software interrupt to ensure rx ring is cleaned */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2734
	ew32(ICS, E1000_ICS_RXDMT0);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2735
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2736
	/* Force detection of hung controller every watchdog period */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2737
	if (!adapter->ecdev) adapter->detect_tx_hung = true;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2738
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2739
	/* With 82571 controllers, LAA may be overwritten due to controller
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2740
	 * reset from the other port. Set the appropriate LAA in RAR[0] */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2741
	if (hw->mac_type == e1000_82571 && hw->laa_is_present)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2742
		e1000_rar_set(hw, hw->mac_addr, 0);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2743
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2744
	/* Reset the timer */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2745
	if (!adapter->ecdev)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2746
		mod_timer(&adapter->watchdog_timer, round_jiffies(jiffies + 2 * HZ));
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2747
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2748
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2749
enum latency_range {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2750
	lowest_latency = 0,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2751
	low_latency = 1,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2752
	bulk_latency = 2,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2753
	latency_invalid = 255
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2754
};
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2755
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2756
/**
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2757
 * e1000_update_itr - update the dynamic ITR value based on statistics
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2758
 *      Stores a new ITR value based on packets and byte
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2759
 *      counts during the last interrupt.  The advantage of per interrupt
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2760
 *      computation is faster updates and more accurate ITR for the current
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2761
 *      traffic pattern.  Constants in this function were computed
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2762
 *      based on theoretical maximum wire speed and thresholds were set based
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2763
 *      on testing data as well as attempting to minimize response time
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2764
 *      while increasing bulk throughput.
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2765
 *      this functionality is controlled by the InterruptThrottleRate module
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2766
 *      parameter (see e1000_param.c)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2767
 * @adapter: pointer to adapter
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2768
 * @itr_setting: current adapter->itr
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2769
 * @packets: the number of packets during this measurement interval
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2770
 * @bytes: the number of bytes during this measurement interval
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2771
 **/
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2772
static unsigned int e1000_update_itr(struct e1000_adapter *adapter,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2773
				     u16 itr_setting, int packets, int bytes)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2774
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2775
	unsigned int retval = itr_setting;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2776
	struct e1000_hw *hw = &adapter->hw;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2777
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2778
	if (unlikely(hw->mac_type < e1000_82540))
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2779
		goto update_itr_done;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2780
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2781
	if (packets == 0)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2782
		goto update_itr_done;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2783
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2784
	switch (itr_setting) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2785
	case lowest_latency:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2786
		/* jumbo frames get bulk treatment*/
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2787
		if (bytes/packets > 8000)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2788
			retval = bulk_latency;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2789
		else if ((packets < 5) && (bytes > 512))
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2790
			retval = low_latency;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2791
		break;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2792
	case low_latency:  /* 50 usec aka 20000 ints/s */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2793
		if (bytes > 10000) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2794
			/* jumbo frames need bulk latency setting */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2795
			if (bytes/packets > 8000)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2796
				retval = bulk_latency;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2797
			else if ((packets < 10) || ((bytes/packets) > 1200))
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2798
				retval = bulk_latency;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2799
			else if ((packets > 35))
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2800
				retval = lowest_latency;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2801
		} else if (bytes/packets > 2000)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2802
			retval = bulk_latency;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2803
		else if (packets <= 2 && bytes < 512)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2804
			retval = lowest_latency;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2805
		break;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2806
	case bulk_latency: /* 250 usec aka 4000 ints/s */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2807
		if (bytes > 25000) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2808
			if (packets > 35)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2809
				retval = low_latency;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2810
		} else if (bytes < 6000) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2811
			retval = low_latency;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2812
		}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2813
		break;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2814
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2815
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2816
update_itr_done:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2817
	return retval;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2818
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2819
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2820
static void e1000_set_itr(struct e1000_adapter *adapter)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2821
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2822
	struct e1000_hw *hw = &adapter->hw;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2823
	u16 current_itr;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2824
	u32 new_itr = adapter->itr;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2825
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2826
	if (unlikely(hw->mac_type < e1000_82540))
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2827
		return;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2828
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2829
	/* for non-gigabit speeds, just fix the interrupt rate at 4000 */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2830
	if (unlikely(adapter->link_speed != SPEED_1000)) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2831
		current_itr = 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2832
		new_itr = 4000;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2833
		goto set_itr_now;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2834
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2835
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2836
	adapter->tx_itr = e1000_update_itr(adapter,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2837
	                            adapter->tx_itr,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2838
	                            adapter->total_tx_packets,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2839
	                            adapter->total_tx_bytes);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2840
	/* conservative mode (itr 3) eliminates the lowest_latency setting */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2841
	if (adapter->itr_setting == 3 && adapter->tx_itr == lowest_latency)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2842
		adapter->tx_itr = low_latency;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2843
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2844
	adapter->rx_itr = e1000_update_itr(adapter,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2845
	                            adapter->rx_itr,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2846
	                            adapter->total_rx_packets,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2847
	                            adapter->total_rx_bytes);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2848
	/* conservative mode (itr 3) eliminates the lowest_latency setting */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2849
	if (adapter->itr_setting == 3 && adapter->rx_itr == lowest_latency)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2850
		adapter->rx_itr = low_latency;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2851
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2852
	current_itr = max(adapter->rx_itr, adapter->tx_itr);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2853
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2854
	switch (current_itr) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2855
	/* counts and packets in update_itr are dependent on these numbers */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2856
	case lowest_latency:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2857
		new_itr = 70000;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2858
		break;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2859
	case low_latency:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2860
		new_itr = 20000; /* aka hwitr = ~200 */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2861
		break;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2862
	case bulk_latency:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2863
		new_itr = 4000;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2864
		break;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2865
	default:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2866
		break;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2867
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2868
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2869
set_itr_now:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2870
	if (new_itr != adapter->itr) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2871
		/* this attempts to bias the interrupt rate towards Bulk
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2872
		 * by adding intermediate steps when interrupt rate is
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2873
		 * increasing */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2874
		new_itr = new_itr > adapter->itr ?
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2875
		             min(adapter->itr + (new_itr >> 2), new_itr) :
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2876
		             new_itr;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2877
		adapter->itr = new_itr;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2878
		ew32(ITR, 1000000000 / (new_itr * 256));
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2879
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2880
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2881
	return;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2882
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2883
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2884
#define E1000_TX_FLAGS_CSUM		0x00000001
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2885
#define E1000_TX_FLAGS_VLAN		0x00000002
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2886
#define E1000_TX_FLAGS_TSO		0x00000004
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2887
#define E1000_TX_FLAGS_IPV4		0x00000008
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2888
#define E1000_TX_FLAGS_VLAN_MASK	0xffff0000
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2889
#define E1000_TX_FLAGS_VLAN_SHIFT	16
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2890
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2891
static int e1000_tso(struct e1000_adapter *adapter,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2892
		     struct e1000_tx_ring *tx_ring, struct sk_buff *skb)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2893
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2894
	struct e1000_context_desc *context_desc;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2895
	struct e1000_buffer *buffer_info;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2896
	unsigned int i;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2897
	u32 cmd_length = 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2898
	u16 ipcse = 0, tucse, mss;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2899
	u8 ipcss, ipcso, tucss, tucso, hdr_len;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2900
	int err;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2901
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2902
	if (skb_is_gso(skb)) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2903
		if (skb_header_cloned(skb)) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2904
			err = pskb_expand_head(skb, 0, 0, GFP_ATOMIC);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2905
			if (err)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2906
				return err;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2907
		}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2908
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2909
		hdr_len = skb_transport_offset(skb) + tcp_hdrlen(skb);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2910
		mss = skb_shinfo(skb)->gso_size;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2911
		if (skb->protocol == htons(ETH_P_IP)) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2912
			struct iphdr *iph = ip_hdr(skb);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2913
			iph->tot_len = 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2914
			iph->check = 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2915
			tcp_hdr(skb)->check = ~csum_tcpudp_magic(iph->saddr,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2916
								 iph->daddr, 0,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2917
								 IPPROTO_TCP,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2918
								 0);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2919
			cmd_length = E1000_TXD_CMD_IP;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2920
			ipcse = skb_transport_offset(skb) - 1;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2921
		} else if (skb->protocol == htons(ETH_P_IPV6)) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2922
			ipv6_hdr(skb)->payload_len = 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2923
			tcp_hdr(skb)->check =
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2924
				~csum_ipv6_magic(&ipv6_hdr(skb)->saddr,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2925
						 &ipv6_hdr(skb)->daddr,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2926
						 0, IPPROTO_TCP, 0);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2927
			ipcse = 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2928
		}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2929
		ipcss = skb_network_offset(skb);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2930
		ipcso = (void *)&(ip_hdr(skb)->check) - (void *)skb->data;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2931
		tucss = skb_transport_offset(skb);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2932
		tucso = (void *)&(tcp_hdr(skb)->check) - (void *)skb->data;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2933
		tucse = 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2934
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2935
		cmd_length |= (E1000_TXD_CMD_DEXT | E1000_TXD_CMD_TSE |
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2936
			       E1000_TXD_CMD_TCP | (skb->len - (hdr_len)));
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2937
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2938
		i = tx_ring->next_to_use;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2939
		context_desc = E1000_CONTEXT_DESC(*tx_ring, i);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2940
		buffer_info = &tx_ring->buffer_info[i];
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2941
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2942
		context_desc->lower_setup.ip_fields.ipcss  = ipcss;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2943
		context_desc->lower_setup.ip_fields.ipcso  = ipcso;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2944
		context_desc->lower_setup.ip_fields.ipcse  = cpu_to_le16(ipcse);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2945
		context_desc->upper_setup.tcp_fields.tucss = tucss;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2946
		context_desc->upper_setup.tcp_fields.tucso = tucso;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2947
		context_desc->upper_setup.tcp_fields.tucse = cpu_to_le16(tucse);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2948
		context_desc->tcp_seg_setup.fields.mss     = cpu_to_le16(mss);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2949
		context_desc->tcp_seg_setup.fields.hdr_len = hdr_len;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2950
		context_desc->cmd_and_length = cpu_to_le32(cmd_length);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2951
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2952
		buffer_info->time_stamp = jiffies;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2953
		buffer_info->next_to_watch = i;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2954
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2955
		if (++i == tx_ring->count) i = 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2956
		tx_ring->next_to_use = i;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2957
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2958
		return true;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2959
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2960
	return false;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2961
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2962
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2963
static bool e1000_tx_csum(struct e1000_adapter *adapter,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2964
			  struct e1000_tx_ring *tx_ring, struct sk_buff *skb)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2965
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2966
	struct e1000_context_desc *context_desc;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2967
	struct e1000_buffer *buffer_info;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2968
	unsigned int i;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2969
	u8 css;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2970
	u32 cmd_len = E1000_TXD_CMD_DEXT;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2971
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2972
	if (skb->ip_summed != CHECKSUM_PARTIAL)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2973
		return false;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2974
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2975
	switch (skb->protocol) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2976
	case cpu_to_be16(ETH_P_IP):
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2977
		if (ip_hdr(skb)->protocol == IPPROTO_TCP)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2978
			cmd_len |= E1000_TXD_CMD_TCP;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2979
		break;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2980
	case cpu_to_be16(ETH_P_IPV6):
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2981
		/* XXX not handling all IPV6 headers */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2982
		if (ipv6_hdr(skb)->nexthdr == IPPROTO_TCP)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2983
			cmd_len |= E1000_TXD_CMD_TCP;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2984
		break;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2985
	default:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2986
		if (unlikely(net_ratelimit()))
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2987
			DPRINTK(DRV, WARNING,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2988
			        "checksum_partial proto=%x!\n", skb->protocol);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2989
		break;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2990
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2991
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2992
	css = skb_transport_offset(skb);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2993
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2994
	i = tx_ring->next_to_use;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2995
	buffer_info = &tx_ring->buffer_info[i];
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2996
	context_desc = E1000_CONTEXT_DESC(*tx_ring, i);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2997
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2998
	context_desc->lower_setup.ip_config = 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2999
	context_desc->upper_setup.tcp_fields.tucss = css;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3000
	context_desc->upper_setup.tcp_fields.tucso =
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3001
		css + skb->csum_offset;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3002
	context_desc->upper_setup.tcp_fields.tucse = 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3003
	context_desc->tcp_seg_setup.data = 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3004
	context_desc->cmd_and_length = cpu_to_le32(cmd_len);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3005
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3006
	buffer_info->time_stamp = jiffies;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3007
	buffer_info->next_to_watch = i;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3008
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3009
	if (unlikely(++i == tx_ring->count)) i = 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3010
	tx_ring->next_to_use = i;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3011
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3012
	return true;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3013
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3014
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3015
#define E1000_MAX_TXD_PWR	12
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3016
#define E1000_MAX_DATA_PER_TXD	(1<<E1000_MAX_TXD_PWR)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3017
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3018
static int e1000_tx_map(struct e1000_adapter *adapter,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3019
			struct e1000_tx_ring *tx_ring,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3020
			struct sk_buff *skb, unsigned int first,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3021
			unsigned int max_per_txd, unsigned int nr_frags,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3022
			unsigned int mss)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3023
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3024
	struct e1000_hw *hw = &adapter->hw;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3025
	struct e1000_buffer *buffer_info;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3026
	unsigned int len = skb_headlen(skb);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3027
	unsigned int offset, size, count = 0, i;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3028
	unsigned int f;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3029
	dma_addr_t *map;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3030
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3031
	i = tx_ring->next_to_use;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3032
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3033
	if (skb_dma_map(&adapter->pdev->dev, skb, DMA_TO_DEVICE)) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3034
		dev_err(&adapter->pdev->dev, "TX DMA map failed\n");
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3035
		return 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3036
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3037
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3038
	map = skb_shinfo(skb)->dma_maps;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3039
	offset = 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3040
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3041
	while (len) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3042
		buffer_info = &tx_ring->buffer_info[i];
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3043
		size = min(len, max_per_txd);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3044
		/* Workaround for Controller erratum --
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3045
		 * descriptor for non-tso packet in a linear SKB that follows a
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3046
		 * tso gets written back prematurely before the data is fully
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3047
		 * DMA'd to the controller */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3048
		if (!skb->data_len && tx_ring->last_tx_tso &&
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3049
		    !skb_is_gso(skb)) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3050
			tx_ring->last_tx_tso = 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3051
			size -= 4;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3052
		}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3053
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3054
		/* Workaround for premature desc write-backs
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3055
		 * in TSO mode.  Append 4-byte sentinel desc */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3056
		if (unlikely(mss && !nr_frags && size == len && size > 8))
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3057
			size -= 4;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3058
		/* work-around for errata 10 and it applies
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3059
		 * to all controllers in PCI-X mode
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3060
		 * The fix is to make sure that the first descriptor of a
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3061
		 * packet is smaller than 2048 - 16 - 16 (or 2016) bytes
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3062
		 */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3063
		if (unlikely((hw->bus_type == e1000_bus_type_pcix) &&
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3064
		                (size > 2015) && count == 0))
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3065
		        size = 2015;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3066
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3067
		/* Workaround for potential 82544 hang in PCI-X.  Avoid
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3068
		 * terminating buffers within evenly-aligned dwords. */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3069
		if (unlikely(adapter->pcix_82544 &&
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3070
		   !((unsigned long)(skb->data + offset + size - 1) & 4) &&
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3071
		   size > 4))
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3072
			size -= 4;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3073
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3074
		buffer_info->length = size;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3075
		buffer_info->dma = skb_shinfo(skb)->dma_head + offset;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3076
		buffer_info->time_stamp = jiffies;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3077
		buffer_info->next_to_watch = i;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3078
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3079
		len -= size;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3080
		offset += size;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3081
		count++;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3082
		if (len) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3083
			i++;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3084
			if (unlikely(i == tx_ring->count))
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3085
				i = 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3086
		}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3087
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3088
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3089
	for (f = 0; f < nr_frags; f++) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3090
		struct skb_frag_struct *frag;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3091
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3092
		frag = &skb_shinfo(skb)->frags[f];
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3093
		len = frag->size;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3094
		offset = 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3095
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3096
		while (len) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3097
			i++;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3098
			if (unlikely(i == tx_ring->count))
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3099
				i = 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3100
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3101
			buffer_info = &tx_ring->buffer_info[i];
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3102
			size = min(len, max_per_txd);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3103
			/* Workaround for premature desc write-backs
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3104
			 * in TSO mode.  Append 4-byte sentinel desc */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3105
			if (unlikely(mss && f == (nr_frags-1) && size == len && size > 8))
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3106
				size -= 4;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3107
			/* Workaround for potential 82544 hang in PCI-X.
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3108
			 * Avoid terminating buffers within evenly-aligned
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3109
			 * dwords. */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3110
			if (unlikely(adapter->pcix_82544 &&
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3111
			   !((unsigned long)(frag->page+offset+size-1) & 4) &&
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3112
			   size > 4))
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3113
				size -= 4;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3114
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3115
			buffer_info->length = size;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3116
			buffer_info->dma = map[f] + offset;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3117
			buffer_info->time_stamp = jiffies;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3118
			buffer_info->next_to_watch = i;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3119
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3120
			len -= size;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3121
			offset += size;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3122
			count++;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3123
		}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3124
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3125
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3126
	tx_ring->buffer_info[i].skb = skb;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3127
	tx_ring->buffer_info[first].next_to_watch = i;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3128
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3129
	return count;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3130
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3131
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3132
static void e1000_tx_queue(struct e1000_adapter *adapter,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3133
			   struct e1000_tx_ring *tx_ring, int tx_flags,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3134
			   int count)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3135
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3136
	struct e1000_hw *hw = &adapter->hw;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3137
	struct e1000_tx_desc *tx_desc = NULL;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3138
	struct e1000_buffer *buffer_info;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3139
	u32 txd_upper = 0, txd_lower = E1000_TXD_CMD_IFCS;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3140
	unsigned int i;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3141
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3142
	if (likely(tx_flags & E1000_TX_FLAGS_TSO)) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3143
		txd_lower |= E1000_TXD_CMD_DEXT | E1000_TXD_DTYP_D |
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3144
		             E1000_TXD_CMD_TSE;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3145
		txd_upper |= E1000_TXD_POPTS_TXSM << 8;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3146
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3147
		if (likely(tx_flags & E1000_TX_FLAGS_IPV4))
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3148
			txd_upper |= E1000_TXD_POPTS_IXSM << 8;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3149
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3150
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3151
	if (likely(tx_flags & E1000_TX_FLAGS_CSUM)) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3152
		txd_lower |= E1000_TXD_CMD_DEXT | E1000_TXD_DTYP_D;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3153
		txd_upper |= E1000_TXD_POPTS_TXSM << 8;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3154
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3155
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3156
	if (unlikely(tx_flags & E1000_TX_FLAGS_VLAN)) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3157
		txd_lower |= E1000_TXD_CMD_VLE;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3158
		txd_upper |= (tx_flags & E1000_TX_FLAGS_VLAN_MASK);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3159
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3160
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3161
	i = tx_ring->next_to_use;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3162
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3163
	while (count--) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3164
		buffer_info = &tx_ring->buffer_info[i];
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3165
		tx_desc = E1000_TX_DESC(*tx_ring, i);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3166
		tx_desc->buffer_addr = cpu_to_le64(buffer_info->dma);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3167
		tx_desc->lower.data =
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3168
			cpu_to_le32(txd_lower | buffer_info->length);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3169
		tx_desc->upper.data = cpu_to_le32(txd_upper);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3170
		if (unlikely(++i == tx_ring->count)) i = 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3171
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3172
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3173
	tx_desc->lower.data |= cpu_to_le32(adapter->txd_cmd);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3174
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3175
	/* Force memory writes to complete before letting h/w
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3176
	 * know there are new descriptors to fetch.  (Only
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3177
	 * applicable for weak-ordered memory model archs,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3178
	 * such as IA-64). */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3179
	wmb();
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3180
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3181
	tx_ring->next_to_use = i;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3182
	writel(i, hw->hw_addr + tx_ring->tdt);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3183
	/* we need this if more than one processor can write to our tail
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3184
	 * at a time, it syncronizes IO on IA64/Altix systems */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3185
	mmiowb();
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3186
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3187
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3188
/**
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3189
 * 82547 workaround to avoid controller hang in half-duplex environment.
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3190
 * The workaround is to avoid queuing a large packet that would span
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3191
 * the internal Tx FIFO ring boundary by notifying the stack to resend
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3192
 * the packet at a later time.  This gives the Tx FIFO an opportunity to
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3193
 * flush all packets.  When that occurs, we reset the Tx FIFO pointers
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3194
 * to the beginning of the Tx FIFO.
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3195
 **/
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3196
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3197
#define E1000_FIFO_HDR			0x10
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3198
#define E1000_82547_PAD_LEN		0x3E0
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3199
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3200
static int e1000_82547_fifo_workaround(struct e1000_adapter *adapter,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3201
				       struct sk_buff *skb)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3202
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3203
	u32 fifo_space = adapter->tx_fifo_size - adapter->tx_fifo_head;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3204
	u32 skb_fifo_len = skb->len + E1000_FIFO_HDR;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3205
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3206
	skb_fifo_len = ALIGN(skb_fifo_len, E1000_FIFO_HDR);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3207
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3208
	if (adapter->link_duplex != HALF_DUPLEX)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3209
		goto no_fifo_stall_required;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3210
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3211
	if (atomic_read(&adapter->tx_fifo_stall))
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3212
		return 1;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3213
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3214
	if (skb_fifo_len >= (E1000_82547_PAD_LEN + fifo_space)) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3215
		atomic_set(&adapter->tx_fifo_stall, 1);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3216
		return 1;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3217
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3218
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3219
no_fifo_stall_required:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3220
	adapter->tx_fifo_head += skb_fifo_len;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3221
	if (adapter->tx_fifo_head >= adapter->tx_fifo_size)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3222
		adapter->tx_fifo_head -= adapter->tx_fifo_size;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3223
	return 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3224
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3225
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3226
#define MINIMUM_DHCP_PACKET_SIZE 282
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3227
static int e1000_transfer_dhcp_info(struct e1000_adapter *adapter,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3228
				    struct sk_buff *skb)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3229
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3230
	struct e1000_hw *hw =  &adapter->hw;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3231
	u16 length, offset;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3232
	if (vlan_tx_tag_present(skb)) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3233
		if (!((vlan_tx_tag_get(skb) == hw->mng_cookie.vlan_id) &&
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3234
			( hw->mng_cookie.status &
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3235
			  E1000_MNG_DHCP_COOKIE_STATUS_VLAN_SUPPORT)) )
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3236
			return 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3237
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3238
	if (skb->len > MINIMUM_DHCP_PACKET_SIZE) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3239
		struct ethhdr *eth = (struct ethhdr *)skb->data;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3240
		if ((htons(ETH_P_IP) == eth->h_proto)) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3241
			const struct iphdr *ip =
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3242
				(struct iphdr *)((u8 *)skb->data+14);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3243
			if (IPPROTO_UDP == ip->protocol) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3244
				struct udphdr *udp =
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3245
					(struct udphdr *)((u8 *)ip +
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3246
						(ip->ihl << 2));
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3247
				if (ntohs(udp->dest) == 67) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3248
					offset = (u8 *)udp + 8 - skb->data;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3249
					length = skb->len - offset;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3250
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3251
					return e1000_mng_write_dhcp_info(hw,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3252
							(u8 *)udp + 8,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3253
							length);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3254
				}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3255
			}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3256
		}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3257
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3258
	return 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3259
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3260
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3261
static int __e1000_maybe_stop_tx(struct net_device *netdev, int size)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3262
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3263
	struct e1000_adapter *adapter = netdev_priv(netdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3264
	struct e1000_tx_ring *tx_ring = adapter->tx_ring;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3265
2589
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2211
diff changeset
  3266
	if (adapter->ecdev) {
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2211
diff changeset
  3267
		return -EBUSY;
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2211
diff changeset
  3268
	}
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2211
diff changeset
  3269
1996
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3270
	netif_stop_queue(netdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3271
	/* Herbert's original patch had:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3272
	 *  smp_mb__after_netif_stop_queue();
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3273
	 * but since that doesn't exist yet, just open code it. */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3274
	smp_mb();
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3275
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3276
	/* We need to check again in a case another CPU has just
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3277
	 * made room available. */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3278
	if (likely(E1000_DESC_UNUSED(tx_ring) < size))
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3279
		return -EBUSY;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3280
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3281
	/* A reprieve! */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3282
	netif_start_queue(netdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3283
	++adapter->restart_queue;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3284
	return 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3285
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3286
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3287
static int e1000_maybe_stop_tx(struct net_device *netdev,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3288
                               struct e1000_tx_ring *tx_ring, int size)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3289
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3290
	if (likely(E1000_DESC_UNUSED(tx_ring) >= size))
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3291
		return 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3292
	return __e1000_maybe_stop_tx(netdev, size);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3293
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3294
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3295
#define TXD_USE_COUNT(S, X) (((S) >> (X)) + 1 )
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3296
static int e1000_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3297
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3298
	struct e1000_adapter *adapter = netdev_priv(netdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3299
	struct e1000_hw *hw = &adapter->hw;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3300
	struct e1000_tx_ring *tx_ring;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3301
	unsigned int first, max_per_txd = E1000_MAX_DATA_PER_TXD;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3302
	unsigned int max_txd_pwr = E1000_MAX_TXD_PWR;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3303
	unsigned int tx_flags = 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3304
	unsigned int len = skb->len - skb->data_len;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3305
	unsigned int nr_frags = 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3306
	unsigned int mss = 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3307
	int count = 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3308
	int tso;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3309
	unsigned int f;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3310
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3311
	/* This goes back to the question of how to logically map a tx queue
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3312
	 * to a flow.  Right now, performance is impacted slightly negatively
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3313
	 * if using multiple tx queues.  If the stack breaks away from a
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3314
	 * single qdisc implementation, we can look at this again. */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3315
	tx_ring = adapter->tx_ring;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3316
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3317
	if (unlikely(skb->len <= 0)) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3318
		if (!adapter->ecdev)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3319
			dev_kfree_skb_any(skb);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3320
		return NETDEV_TX_OK;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3321
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3322
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3323
	/* 82571 and newer doesn't need the workaround that limited descriptor
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3324
	 * length to 4kB */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3325
	if (hw->mac_type >= e1000_82571)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3326
		max_per_txd = 8192;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3327
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3328
	mss = skb_shinfo(skb)->gso_size;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3329
	/* The controller does a simple calculation to
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3330
	 * make sure there is enough room in the FIFO before
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3331
	 * initiating the DMA for each buffer.  The calc is:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3332
	 * 4 = ceil(buffer len/mss).  To make sure we don't
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3333
	 * overrun the FIFO, adjust the max buffer len if mss
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3334
	 * drops. */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3335
	if (mss) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3336
		u8 hdr_len;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3337
		max_per_txd = min(mss << 2, max_per_txd);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3338
		max_txd_pwr = fls(max_per_txd) - 1;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3339
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3340
		/* TSO Workaround for 82571/2/3 Controllers -- if skb->data
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3341
		* points to just header, pull a few bytes of payload from
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3342
		* frags into skb->data */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3343
		hdr_len = skb_transport_offset(skb) + tcp_hdrlen(skb);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3344
		if (skb->data_len && hdr_len == len) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3345
			switch (hw->mac_type) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3346
				unsigned int pull_size;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3347
			case e1000_82544:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3348
				/* Make sure we have room to chop off 4 bytes,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3349
				 * and that the end alignment will work out to
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3350
				 * this hardware's requirements
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3351
				 * NOTE: this is a TSO only workaround
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3352
				 * if end byte alignment not correct move us
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3353
				 * into the next dword */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3354
				if ((unsigned long)(skb_tail_pointer(skb) - 1) & 4)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3355
					break;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3356
				/* fall through */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3357
			case e1000_82571:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3358
			case e1000_82572:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3359
			case e1000_82573:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3360
			case e1000_ich8lan:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3361
				pull_size = min((unsigned int)4, skb->data_len);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3362
				if (!__pskb_pull_tail(skb, pull_size)) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3363
					DPRINTK(DRV, ERR,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3364
						"__pskb_pull_tail failed.\n");
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3365
					dev_kfree_skb_any(skb);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3366
					return NETDEV_TX_OK;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3367
				}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3368
				len = skb->len - skb->data_len;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3369
				break;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3370
			default:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3371
				/* do nothing */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3372
				break;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3373
			}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3374
		}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3375
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3376
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3377
	/* reserve a descriptor for the offload context */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3378
	if ((mss) || (skb->ip_summed == CHECKSUM_PARTIAL))
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3379
		count++;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3380
	count++;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3381
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3382
	/* Controller Erratum workaround */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3383
	if (!skb->data_len && tx_ring->last_tx_tso && !skb_is_gso(skb))
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3384
		count++;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3385
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3386
	count += TXD_USE_COUNT(len, max_txd_pwr);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3387
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3388
	if (adapter->pcix_82544)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3389
		count++;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3390
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3391
	/* work-around for errata 10 and it applies to all controllers
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3392
	 * in PCI-X mode, so add one more descriptor to the count
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3393
	 */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3394
	if (unlikely((hw->bus_type == e1000_bus_type_pcix) &&
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3395
			(len > 2015)))
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3396
		count++;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3397
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3398
	nr_frags = skb_shinfo(skb)->nr_frags;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3399
	for (f = 0; f < nr_frags; f++)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3400
		count += TXD_USE_COUNT(skb_shinfo(skb)->frags[f].size,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3401
				       max_txd_pwr);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3402
	if (adapter->pcix_82544)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3403
		count += nr_frags;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3404
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3405
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3406
	if (hw->tx_pkt_filtering &&
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3407
	    (hw->mac_type == e1000_82573))
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3408
		e1000_transfer_dhcp_info(adapter, skb);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3409
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3410
	/* need: count + 2 desc gap to keep tail from touching
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3411
	 * head, otherwise try next time */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3412
	if (unlikely(e1000_maybe_stop_tx(netdev, tx_ring, count + 2)))
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3413
		return NETDEV_TX_BUSY;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3414
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3415
	if (unlikely(hw->mac_type == e1000_82547)) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3416
		if (unlikely(e1000_82547_fifo_workaround(adapter, skb))) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3417
			if (!adapter->ecdev) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3418
				netif_stop_queue(netdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3419
				mod_timer(&adapter->tx_fifo_stall_timer, jiffies + 1);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3420
			}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3421
			return NETDEV_TX_BUSY;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3422
		}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3423
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3424
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3425
	if (unlikely(adapter->vlgrp && vlan_tx_tag_present(skb))) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3426
		tx_flags |= E1000_TX_FLAGS_VLAN;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3427
		tx_flags |= (vlan_tx_tag_get(skb) << E1000_TX_FLAGS_VLAN_SHIFT);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3428
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3429
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3430
	first = tx_ring->next_to_use;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3431
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3432
	tso = e1000_tso(adapter, tx_ring, skb);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3433
	if (tso < 0) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3434
		if (!adapter->ecdev) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3435
			dev_kfree_skb_any(skb);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3436
		}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3437
		return NETDEV_TX_OK;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3438
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3439
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3440
	if (likely(tso)) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3441
		tx_ring->last_tx_tso = 1;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3442
		tx_flags |= E1000_TX_FLAGS_TSO;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3443
	} else if (likely(e1000_tx_csum(adapter, tx_ring, skb)))
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3444
		tx_flags |= E1000_TX_FLAGS_CSUM;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3445
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3446
	/* Old method was to assume IPv4 packet by default if TSO was enabled.
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3447
	 * 82571 hardware supports TSO capabilities for IPv6 as well...
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3448
	 * no longer assume, we must. */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3449
	if (likely(skb->protocol == htons(ETH_P_IP)))
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3450
		tx_flags |= E1000_TX_FLAGS_IPV4;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3451
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3452
	count = e1000_tx_map(adapter, tx_ring, skb, first, max_per_txd,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3453
	                     nr_frags, mss);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3454
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3455
	if (count) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3456
		e1000_tx_queue(adapter, tx_ring, tx_flags, count);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3457
		if (!adapter->ecdev) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3458
			/* Make sure there is space in the ring for the next send. */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3459
			e1000_maybe_stop_tx(netdev, tx_ring, MAX_SKB_FRAGS + 2);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3460
		}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3461
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3462
	} else {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3463
		if (!adapter->ecdev) dev_kfree_skb_any(skb);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3464
		tx_ring->buffer_info[first].time_stamp = 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3465
		tx_ring->next_to_use = first;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3466
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3467
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3468
	return NETDEV_TX_OK;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3469
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3470
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3471
/**
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3472
 * e1000_tx_timeout - Respond to a Tx Hang
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3473
 * @netdev: network interface device structure
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3474
 **/
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3475
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3476
static void e1000_tx_timeout(struct net_device *netdev)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3477
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3478
	struct e1000_adapter *adapter = netdev_priv(netdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3479
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3480
	/* Do the reset outside of interrupt context */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3481
	adapter->tx_timeout_count++;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3482
	schedule_work(&adapter->reset_task);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3483
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3484
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3485
static void e1000_reset_task(struct work_struct *work)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3486
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3487
	struct e1000_adapter *adapter =
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3488
		container_of(work, struct e1000_adapter, reset_task);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3489
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3490
	e1000_reinit_locked(adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3491
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3492
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3493
/**
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3494
 * e1000_get_stats - Get System Network Statistics
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3495
 * @netdev: network interface device structure
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3496
 *
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3497
 * Returns the address of the device statistics structure.
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3498
 * The statistics are actually updated from the timer callback.
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3499
 **/
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3500
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3501
static struct net_device_stats *e1000_get_stats(struct net_device *netdev)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3502
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3503
	struct e1000_adapter *adapter = netdev_priv(netdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3504
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3505
	/* only return the current stats */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3506
	return &adapter->net_stats;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3507
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3508
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3509
/**
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3510
 * e1000_change_mtu - Change the Maximum Transfer Unit
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3511
 * @netdev: network interface device structure
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3512
 * @new_mtu: new value for maximum frame size
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3513
 *
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3514
 * Returns 0 on success, negative on failure
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3515
 **/
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3516
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3517
static int e1000_change_mtu(struct net_device *netdev, int new_mtu)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3518
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3519
	struct e1000_adapter *adapter = netdev_priv(netdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3520
	struct e1000_hw *hw = &adapter->hw;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3521
	int max_frame = new_mtu + ENET_HEADER_SIZE + ETHERNET_FCS_SIZE;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3522
	u16 eeprom_data = 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3523
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3524
	if (adapter->ecdev)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3525
		return -EBUSY;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3526
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3527
	if ((max_frame < MINIMUM_ETHERNET_FRAME_SIZE) ||
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3528
	    (max_frame > MAX_JUMBO_FRAME_SIZE)) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3529
		DPRINTK(PROBE, ERR, "Invalid MTU setting\n");
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3530
		return -EINVAL;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3531
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3532
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3533
	/* Adapter-specific max frame size limits. */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3534
	switch (hw->mac_type) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3535
	case e1000_undefined ... e1000_82542_rev2_1:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3536
	case e1000_ich8lan:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3537
		if (max_frame > MAXIMUM_ETHERNET_FRAME_SIZE) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3538
			DPRINTK(PROBE, ERR, "Jumbo Frames not supported.\n");
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3539
			return -EINVAL;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3540
		}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3541
		break;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3542
	case e1000_82573:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3543
		/* Jumbo Frames not supported if:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3544
		 * - this is not an 82573L device
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3545
		 * - ASPM is enabled in any way (0x1A bits 3:2) */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3546
		e1000_read_eeprom(hw, EEPROM_INIT_3GIO_3, 1,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3547
		                  &eeprom_data);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3548
		if ((hw->device_id != E1000_DEV_ID_82573L) ||
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3549
		    (eeprom_data & EEPROM_WORD1A_ASPM_MASK)) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3550
			if (max_frame > MAXIMUM_ETHERNET_FRAME_SIZE) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3551
				DPRINTK(PROBE, ERR,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3552
			            	"Jumbo Frames not supported.\n");
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3553
				return -EINVAL;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3554
			}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3555
			break;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3556
		}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3557
		/* ERT will be enabled later to enable wire speed receives */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3558
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3559
		/* fall through to get support */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3560
	case e1000_82571:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3561
	case e1000_82572:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3562
	case e1000_80003es2lan:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3563
#define MAX_STD_JUMBO_FRAME_SIZE 9234
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3564
		if (max_frame > MAX_STD_JUMBO_FRAME_SIZE) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3565
			DPRINTK(PROBE, ERR, "MTU > 9216 not supported.\n");
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3566
			return -EINVAL;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3567
		}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3568
		break;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3569
	default:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3570
		/* Capable of supporting up to MAX_JUMBO_FRAME_SIZE limit. */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3571
		break;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3572
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3573
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3574
	/* NOTE: netdev_alloc_skb reserves 16 bytes, and typically NET_IP_ALIGN
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3575
	 * means we reserve 2 more, this pushes us to allocate from the next
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3576
	 * larger slab size
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3577
	 * i.e. RXBUFFER_2048 --> size-4096 slab */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3578
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3579
	if (max_frame <= E1000_RXBUFFER_256)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3580
		adapter->rx_buffer_len = E1000_RXBUFFER_256;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3581
	else if (max_frame <= E1000_RXBUFFER_512)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3582
		adapter->rx_buffer_len = E1000_RXBUFFER_512;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3583
	else if (max_frame <= E1000_RXBUFFER_1024)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3584
		adapter->rx_buffer_len = E1000_RXBUFFER_1024;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3585
	else if (max_frame <= E1000_RXBUFFER_2048)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3586
		adapter->rx_buffer_len = E1000_RXBUFFER_2048;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3587
	else if (max_frame <= E1000_RXBUFFER_4096)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3588
		adapter->rx_buffer_len = E1000_RXBUFFER_4096;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3589
	else if (max_frame <= E1000_RXBUFFER_8192)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3590
		adapter->rx_buffer_len = E1000_RXBUFFER_8192;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3591
	else if (max_frame <= E1000_RXBUFFER_16384)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3592
		adapter->rx_buffer_len = E1000_RXBUFFER_16384;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3593
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3594
	/* adjust allocation if LPE protects us, and we aren't using SBP */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3595
	if (!hw->tbi_compatibility_on &&
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3596
	    ((max_frame == MAXIMUM_ETHERNET_FRAME_SIZE) ||
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3597
	     (max_frame == MAXIMUM_ETHERNET_VLAN_SIZE)))
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3598
		adapter->rx_buffer_len = MAXIMUM_ETHERNET_VLAN_SIZE;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3599
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3600
	netdev->mtu = new_mtu;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3601
	hw->max_frame_size = max_frame;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3602
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3603
	if (netif_running(netdev))
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3604
		e1000_reinit_locked(adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3605
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3606
	return 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3607
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3608
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3609
/**
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3610
 * e1000_update_stats - Update the board statistics counters
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3611
 * @adapter: board private structure
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3612
 **/
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3613
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3614
void e1000_update_stats(struct e1000_adapter *adapter)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3615
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3616
	struct e1000_hw *hw = &adapter->hw;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3617
	struct pci_dev *pdev = adapter->pdev;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3618
	unsigned long flags = 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3619
	u16 phy_tmp;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3620
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3621
#define PHY_IDLE_ERROR_COUNT_MASK 0x00FF
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3622
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3623
	/*
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3624
	 * Prevent stats update while adapter is being reset, or if the pci
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3625
	 * connection is down.
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3626
	 */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3627
	if (adapter->link_speed == 0)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3628
		return;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3629
	if (pci_channel_offline(pdev))
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3630
		return;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3631
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3632
	if (!adapter->ecdev)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3633
		spin_lock_irqsave(&adapter->stats_lock, flags);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3634
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3635
	/* these counters are modified from e1000_tbi_adjust_stats,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3636
	 * called from the interrupt context, so they must only
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3637
	 * be written while holding adapter->stats_lock
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3638
	 */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3639
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3640
	adapter->stats.crcerrs += er32(CRCERRS);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3641
	adapter->stats.gprc += er32(GPRC);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3642
	adapter->stats.gorcl += er32(GORCL);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3643
	adapter->stats.gorch += er32(GORCH);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3644
	adapter->stats.bprc += er32(BPRC);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3645
	adapter->stats.mprc += er32(MPRC);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3646
	adapter->stats.roc += er32(ROC);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3647
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3648
	if (hw->mac_type != e1000_ich8lan) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3649
		adapter->stats.prc64 += er32(PRC64);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3650
		adapter->stats.prc127 += er32(PRC127);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3651
		adapter->stats.prc255 += er32(PRC255);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3652
		adapter->stats.prc511 += er32(PRC511);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3653
		adapter->stats.prc1023 += er32(PRC1023);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3654
		adapter->stats.prc1522 += er32(PRC1522);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3655
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3656
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3657
	adapter->stats.symerrs += er32(SYMERRS);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3658
	adapter->stats.mpc += er32(MPC);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3659
	adapter->stats.scc += er32(SCC);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3660
	adapter->stats.ecol += er32(ECOL);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3661
	adapter->stats.mcc += er32(MCC);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3662
	adapter->stats.latecol += er32(LATECOL);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3663
	adapter->stats.dc += er32(DC);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3664
	adapter->stats.sec += er32(SEC);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3665
	adapter->stats.rlec += er32(RLEC);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3666
	adapter->stats.xonrxc += er32(XONRXC);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3667
	adapter->stats.xontxc += er32(XONTXC);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3668
	adapter->stats.xoffrxc += er32(XOFFRXC);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3669
	adapter->stats.xofftxc += er32(XOFFTXC);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3670
	adapter->stats.fcruc += er32(FCRUC);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3671
	adapter->stats.gptc += er32(GPTC);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3672
	adapter->stats.gotcl += er32(GOTCL);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3673
	adapter->stats.gotch += er32(GOTCH);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3674
	adapter->stats.rnbc += er32(RNBC);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3675
	adapter->stats.ruc += er32(RUC);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3676
	adapter->stats.rfc += er32(RFC);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3677
	adapter->stats.rjc += er32(RJC);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3678
	adapter->stats.torl += er32(TORL);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3679
	adapter->stats.torh += er32(TORH);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3680
	adapter->stats.totl += er32(TOTL);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3681
	adapter->stats.toth += er32(TOTH);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3682
	adapter->stats.tpr += er32(TPR);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3683
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3684
	if (hw->mac_type != e1000_ich8lan) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3685
		adapter->stats.ptc64 += er32(PTC64);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3686
		adapter->stats.ptc127 += er32(PTC127);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3687
		adapter->stats.ptc255 += er32(PTC255);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3688
		adapter->stats.ptc511 += er32(PTC511);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3689
		adapter->stats.ptc1023 += er32(PTC1023);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3690
		adapter->stats.ptc1522 += er32(PTC1522);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3691
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3692
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3693
	adapter->stats.mptc += er32(MPTC);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3694
	adapter->stats.bptc += er32(BPTC);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3695
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3696
	/* used for adaptive IFS */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3697
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3698
	hw->tx_packet_delta = er32(TPT);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3699
	adapter->stats.tpt += hw->tx_packet_delta;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3700
	hw->collision_delta = er32(COLC);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3701
	adapter->stats.colc += hw->collision_delta;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3702
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3703
	if (hw->mac_type >= e1000_82543) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3704
		adapter->stats.algnerrc += er32(ALGNERRC);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3705
		adapter->stats.rxerrc += er32(RXERRC);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3706
		adapter->stats.tncrs += er32(TNCRS);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3707
		adapter->stats.cexterr += er32(CEXTERR);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3708
		adapter->stats.tsctc += er32(TSCTC);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3709
		adapter->stats.tsctfc += er32(TSCTFC);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3710
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3711
	if (hw->mac_type > e1000_82547_rev_2) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3712
		adapter->stats.iac += er32(IAC);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3713
		adapter->stats.icrxoc += er32(ICRXOC);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3714
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3715
		if (hw->mac_type != e1000_ich8lan) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3716
			adapter->stats.icrxptc += er32(ICRXPTC);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3717
			adapter->stats.icrxatc += er32(ICRXATC);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3718
			adapter->stats.ictxptc += er32(ICTXPTC);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3719
			adapter->stats.ictxatc += er32(ICTXATC);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3720
			adapter->stats.ictxqec += er32(ICTXQEC);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3721
			adapter->stats.ictxqmtc += er32(ICTXQMTC);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3722
			adapter->stats.icrxdmtc += er32(ICRXDMTC);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3723
		}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3724
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3725
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3726
	/* Fill out the OS statistics structure */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3727
	adapter->net_stats.multicast = adapter->stats.mprc;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3728
	adapter->net_stats.collisions = adapter->stats.colc;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3729
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3730
	/* Rx Errors */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3731
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3732
	/* RLEC on some newer hardware can be incorrect so build
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3733
	* our own version based on RUC and ROC */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3734
	adapter->net_stats.rx_errors = adapter->stats.rxerrc +
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3735
		adapter->stats.crcerrs + adapter->stats.algnerrc +
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3736
		adapter->stats.ruc + adapter->stats.roc +
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3737
		adapter->stats.cexterr;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3738
	adapter->stats.rlerrc = adapter->stats.ruc + adapter->stats.roc;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3739
	adapter->net_stats.rx_length_errors = adapter->stats.rlerrc;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3740
	adapter->net_stats.rx_crc_errors = adapter->stats.crcerrs;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3741
	adapter->net_stats.rx_frame_errors = adapter->stats.algnerrc;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3742
	adapter->net_stats.rx_missed_errors = adapter->stats.mpc;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3743
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3744
	/* Tx Errors */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3745
	adapter->stats.txerrc = adapter->stats.ecol + adapter->stats.latecol;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3746
	adapter->net_stats.tx_errors = adapter->stats.txerrc;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3747
	adapter->net_stats.tx_aborted_errors = adapter->stats.ecol;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3748
	adapter->net_stats.tx_window_errors = adapter->stats.latecol;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3749
	adapter->net_stats.tx_carrier_errors = adapter->stats.tncrs;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3750
	if (hw->bad_tx_carr_stats_fd &&
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3751
	    adapter->link_duplex == FULL_DUPLEX) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3752
		adapter->net_stats.tx_carrier_errors = 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3753
		adapter->stats.tncrs = 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3754
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3755
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3756
	/* Tx Dropped needs to be maintained elsewhere */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3757
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3758
	/* Phy Stats */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3759
	if (hw->media_type == e1000_media_type_copper) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3760
		if ((adapter->link_speed == SPEED_1000) &&
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3761
		   (!e1000_read_phy_reg(hw, PHY_1000T_STATUS, &phy_tmp))) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3762
			phy_tmp &= PHY_IDLE_ERROR_COUNT_MASK;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3763
			adapter->phy_stats.idle_errors += phy_tmp;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3764
		}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3765
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3766
		if ((hw->mac_type <= e1000_82546) &&
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3767
		   (hw->phy_type == e1000_phy_m88) &&
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3768
		   !e1000_read_phy_reg(hw, M88E1000_RX_ERR_CNTR, &phy_tmp))
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3769
			adapter->phy_stats.receive_errors += phy_tmp;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3770
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3771
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3772
	/* Management Stats */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3773
	if (hw->has_smbus) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3774
		adapter->stats.mgptc += er32(MGTPTC);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3775
		adapter->stats.mgprc += er32(MGTPRC);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3776
		adapter->stats.mgpdc += er32(MGTPDC);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3777
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3778
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3779
	if (!adapter->ecdev)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3780
		spin_unlock_irqrestore(&adapter->stats_lock, flags);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3781
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3782
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3783
void ec_poll(struct net_device *netdev)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3784
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3785
	struct e1000_adapter *adapter = netdev_priv(netdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3786
	if (jiffies - adapter->ec_watchdog_jiffies >= 2 * HZ) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3787
		e1000_watchdog((unsigned long) adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3788
		adapter->ec_watchdog_jiffies = jiffies;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3789
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3790
#ifdef CONFIG_PCI_MSI
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3791
	e1000_intr_msi(0, netdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3792
#else
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3793
	e1000_intr(0, netdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3794
#endif
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3795
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3796
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3797
/**
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3798
 * e1000_intr_msi - Interrupt Handler
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3799
 * @irq: interrupt number
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3800
 * @data: pointer to a network interface device structure
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3801
 **/
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3802
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3803
static irqreturn_t e1000_intr_msi(int irq, void *data)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3804
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3805
	struct net_device *netdev = data;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3806
	struct e1000_adapter *adapter = netdev_priv(netdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3807
	struct e1000_hw *hw = &adapter->hw;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3808
	u32 icr = er32(ICR);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3809
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3810
	if (adapter->ecdev) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3811
		int i, ec_work_done = 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3812
		for (i = 0; i < E1000_MAX_INTR; i++) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3813
			if (unlikely(!adapter->clean_rx(adapter, adapter->rx_ring,
2163
d6d49dcaf7a5 Fixed accidentially used operator & by using &&.
Florian Pose <fp@igh-essen.com>
parents: 1996
diff changeset
  3814
						&ec_work_done, 100) &&
1996
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3815
					!e1000_clean_tx_irq(adapter, adapter->tx_ring))) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3816
				break;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3817
			}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3818
		}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3819
	} else {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3820
		/* in NAPI mode read ICR disables interrupts using IAM */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3821
2211
2a009dc7bd1c Fixed ISR.
Florian Pose <fp@igh-essen.com>
parents: 2163
diff changeset
  3822
		if (icr & (E1000_ICR_RXSEQ | E1000_ICR_LSC)) {
1996
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3823
			hw->get_link_status = 1;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3824
			/* 80003ES2LAN workaround-- For packet buffer work-around on
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3825
			 * link down event; disable receives here in the ISR and reset
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3826
			 * adapter in watchdog */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3827
			if (netif_carrier_ok(netdev) &&
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3828
			    (hw->mac_type == e1000_80003es2lan)) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3829
				/* disable receives */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3830
				u32 rctl = er32(RCTL);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3831
				ew32(RCTL, rctl & ~E1000_RCTL_EN);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3832
			}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3833
			/* guard against interrupt when we're going down */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3834
			if (!test_bit(__E1000_DOWN, &adapter->flags))
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3835
				mod_timer(&adapter->watchdog_timer, jiffies + 1);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3836
		}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3837
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3838
		if (likely(napi_schedule_prep(&adapter->napi))) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3839
			adapter->total_tx_bytes = 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3840
			adapter->total_tx_packets = 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3841
			adapter->total_rx_bytes = 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3842
			adapter->total_rx_packets = 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3843
			__napi_schedule(&adapter->napi);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3844
		} else
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3845
			e1000_irq_enable(adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3846
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3847
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3848
	return IRQ_HANDLED;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3849
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3850
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3851
/**
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3852
 * e1000_intr - Interrupt Handler
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3853
 * @irq: interrupt number
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3854
 * @data: pointer to a network interface device structure
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3855
 **/
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3856
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3857
static irqreturn_t e1000_intr(int irq, void *data)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3858
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3859
	struct net_device *netdev = data;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3860
	struct e1000_adapter *adapter = netdev_priv(netdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3861
	struct e1000_hw *hw = &adapter->hw;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3862
	u32 rctl, icr = er32(ICR);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3863
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3864
	if (unlikely((!icr) || test_bit(__E1000_DOWN, &adapter->flags)))
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3865
		return IRQ_NONE;  /* Not our interrupt */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3866
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3867
	/* IMS will not auto-mask if INT_ASSERTED is not set, and if it is
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3868
	 * not set, then the adapter didn't send an interrupt */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3869
	if (unlikely(hw->mac_type >= e1000_82571 &&
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3870
	             !(icr & E1000_ICR_INT_ASSERTED)))
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3871
		return IRQ_NONE;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3872
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3873
	/* Interrupt Auto-Mask...upon reading ICR, interrupts are masked.  No
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3874
	 * need for the IMC write */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3875
2211
2a009dc7bd1c Fixed ISR.
Florian Pose <fp@igh-essen.com>
parents: 2163
diff changeset
  3876
	if (!adapter->ecdev && unlikely(icr & (E1000_ICR_RXSEQ | E1000_ICR_LSC))) {
1996
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3877
		hw->get_link_status = 1;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3878
		/* 80003ES2LAN workaround--
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3879
		 * For packet buffer work-around on link down event;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3880
		 * disable receives here in the ISR and
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3881
		 * reset adapter in watchdog
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3882
		 */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3883
		if (netif_carrier_ok(netdev) &&
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3884
		    (hw->mac_type == e1000_80003es2lan)) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3885
			/* disable receives */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3886
			rctl = er32(RCTL);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3887
			ew32(RCTL, rctl & ~E1000_RCTL_EN);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3888
		}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3889
		/* guard against interrupt when we're going down */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3890
		if (!test_bit(__E1000_DOWN, &adapter->flags))
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3891
			mod_timer(&adapter->watchdog_timer, jiffies + 1);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3892
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3893
2211
2a009dc7bd1c Fixed ISR.
Florian Pose <fp@igh-essen.com>
parents: 2163
diff changeset
  3894
	if (adapter->ecdev) {
2a009dc7bd1c Fixed ISR.
Florian Pose <fp@igh-essen.com>
parents: 2163
diff changeset
  3895
		int i, ec_work_done = 0;
2a009dc7bd1c Fixed ISR.
Florian Pose <fp@igh-essen.com>
parents: 2163
diff changeset
  3896
		for (i = 0; i < E1000_MAX_INTR; i++) {
2a009dc7bd1c Fixed ISR.
Florian Pose <fp@igh-essen.com>
parents: 2163
diff changeset
  3897
			if (unlikely(!adapter->clean_rx(adapter, adapter->rx_ring,
2a009dc7bd1c Fixed ISR.
Florian Pose <fp@igh-essen.com>
parents: 2163
diff changeset
  3898
							&ec_work_done, 100) &&
2a009dc7bd1c Fixed ISR.
Florian Pose <fp@igh-essen.com>
parents: 2163
diff changeset
  3899
						!e1000_clean_tx_irq(adapter, adapter->tx_ring))) {
2a009dc7bd1c Fixed ISR.
Florian Pose <fp@igh-essen.com>
parents: 2163
diff changeset
  3900
				break;
2a009dc7bd1c Fixed ISR.
Florian Pose <fp@igh-essen.com>
parents: 2163
diff changeset
  3901
			}
2a009dc7bd1c Fixed ISR.
Florian Pose <fp@igh-essen.com>
parents: 2163
diff changeset
  3902
		}
1996
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3903
	} else {
2211
2a009dc7bd1c Fixed ISR.
Florian Pose <fp@igh-essen.com>
parents: 2163
diff changeset
  3904
		if (unlikely(hw->mac_type < e1000_82571)) {
2a009dc7bd1c Fixed ISR.
Florian Pose <fp@igh-essen.com>
parents: 2163
diff changeset
  3905
			/* disable interrupts, without the synchronize_irq bit */
2a009dc7bd1c Fixed ISR.
Florian Pose <fp@igh-essen.com>
parents: 2163
diff changeset
  3906
			ew32(IMC, ~0);
2a009dc7bd1c Fixed ISR.
Florian Pose <fp@igh-essen.com>
parents: 2163
diff changeset
  3907
			E1000_WRITE_FLUSH();
2a009dc7bd1c Fixed ISR.
Florian Pose <fp@igh-essen.com>
parents: 2163
diff changeset
  3908
		}
2a009dc7bd1c Fixed ISR.
Florian Pose <fp@igh-essen.com>
parents: 2163
diff changeset
  3909
		if (likely(napi_schedule_prep(&adapter->napi))) {
2a009dc7bd1c Fixed ISR.
Florian Pose <fp@igh-essen.com>
parents: 2163
diff changeset
  3910
			adapter->total_tx_bytes = 0;
2a009dc7bd1c Fixed ISR.
Florian Pose <fp@igh-essen.com>
parents: 2163
diff changeset
  3911
			adapter->total_tx_packets = 0;
2a009dc7bd1c Fixed ISR.
Florian Pose <fp@igh-essen.com>
parents: 2163
diff changeset
  3912
			adapter->total_rx_bytes = 0;
2a009dc7bd1c Fixed ISR.
Florian Pose <fp@igh-essen.com>
parents: 2163
diff changeset
  3913
			adapter->total_rx_packets = 0;
2a009dc7bd1c Fixed ISR.
Florian Pose <fp@igh-essen.com>
parents: 2163
diff changeset
  3914
			__napi_schedule(&adapter->napi);
2a009dc7bd1c Fixed ISR.
Florian Pose <fp@igh-essen.com>
parents: 2163
diff changeset
  3915
		} else {
2a009dc7bd1c Fixed ISR.
Florian Pose <fp@igh-essen.com>
parents: 2163
diff changeset
  3916
			/* this really should not happen! if it does it is basically a
2a009dc7bd1c Fixed ISR.
Florian Pose <fp@igh-essen.com>
parents: 2163
diff changeset
  3917
			 * bug, but not a hard error, so enable ints and continue */
2a009dc7bd1c Fixed ISR.
Florian Pose <fp@igh-essen.com>
parents: 2163
diff changeset
  3918
			if (!test_bit(__E1000_DOWN, &adapter->flags))
2a009dc7bd1c Fixed ISR.
Florian Pose <fp@igh-essen.com>
parents: 2163
diff changeset
  3919
				e1000_irq_enable(adapter);
2a009dc7bd1c Fixed ISR.
Florian Pose <fp@igh-essen.com>
parents: 2163
diff changeset
  3920
		}
1996
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3921
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3922
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3923
	return IRQ_HANDLED;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3924
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3925
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3926
/**
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3927
 * e1000_clean - NAPI Rx polling callback
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3928
 * @adapter: board private structure
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3929
 * EtherCAT: never called
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3930
 **/
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3931
static int e1000_clean(struct napi_struct *napi, int budget)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3932
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3933
	struct e1000_adapter *adapter = container_of(napi, struct e1000_adapter, napi);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3934
	struct net_device *poll_dev = adapter->netdev;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3935
	int tx_cleaned = 0, work_done = 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3936
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3937
	adapter = netdev_priv(poll_dev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3938
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3939
	tx_cleaned = e1000_clean_tx_irq(adapter, &adapter->tx_ring[0]);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3940
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3941
	adapter->clean_rx(adapter, &adapter->rx_ring[0],
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3942
	                  &work_done, budget);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3943
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3944
	if (!tx_cleaned)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3945
		work_done = budget;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3946
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3947
	/* If budget not fully consumed, exit the polling mode */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3948
	if (work_done < budget) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3949
		if (likely(adapter->itr_setting & 3))
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3950
			e1000_set_itr(adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3951
		napi_complete(napi);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3952
		if (!test_bit(__E1000_DOWN, &adapter->flags))
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3953
			e1000_irq_enable(adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3954
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3955
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3956
	return work_done;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3957
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3958
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3959
/**
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3960
 * e1000_clean_tx_irq - Reclaim resources after transmit completes
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3961
 * @adapter: board private structure
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3962
 **/
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3963
static bool e1000_clean_tx_irq(struct e1000_adapter *adapter,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3964
			       struct e1000_tx_ring *tx_ring)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3965
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3966
	struct e1000_hw *hw = &adapter->hw;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3967
	struct net_device *netdev = adapter->netdev;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3968
	struct e1000_tx_desc *tx_desc, *eop_desc;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3969
	struct e1000_buffer *buffer_info;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3970
	unsigned int i, eop;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3971
	unsigned int count = 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3972
	unsigned int total_tx_bytes=0, total_tx_packets=0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3973
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3974
	i = tx_ring->next_to_clean;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3975
	eop = tx_ring->buffer_info[i].next_to_watch;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3976
	eop_desc = E1000_TX_DESC(*tx_ring, eop);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3977
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3978
	while ((eop_desc->upper.data & cpu_to_le32(E1000_TXD_STAT_DD)) &&
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3979
	       (count < tx_ring->count)) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3980
		bool cleaned = false;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3981
		for ( ; !cleaned; count++) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3982
			tx_desc = E1000_TX_DESC(*tx_ring, i);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3983
			buffer_info = &tx_ring->buffer_info[i];
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3984
			cleaned = (i == eop);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3985
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3986
			if (cleaned) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3987
				struct sk_buff *skb = buffer_info->skb;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3988
				unsigned int segs, bytecount;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3989
				segs = skb_shinfo(skb)->gso_segs ?: 1;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3990
				/* multiply data chunks by size of headers */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3991
				bytecount = ((segs - 1) * skb_headlen(skb)) +
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3992
				            skb->len;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3993
				total_tx_packets += segs;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3994
				total_tx_bytes += bytecount;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3995
			}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3996
			e1000_unmap_and_free_tx_resource(adapter, buffer_info);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3997
			tx_desc->upper.data = 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3998
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3999
			if (unlikely(++i == tx_ring->count)) i = 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4000
		}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4001
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4002
		eop = tx_ring->buffer_info[i].next_to_watch;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4003
		eop_desc = E1000_TX_DESC(*tx_ring, eop);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4004
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4005
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4006
	tx_ring->next_to_clean = i;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4007
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4008
#define TX_WAKE_THRESHOLD 32
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4009
	if (!adapter->ecdev && unlikely(count && netif_carrier_ok(netdev) &&
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4010
		     E1000_DESC_UNUSED(tx_ring) >= TX_WAKE_THRESHOLD)) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4011
		/* Make sure that anybody stopping the queue after this
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4012
		 * sees the new next_to_clean.
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4013
		 */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4014
		smp_mb();
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4015
		if (netif_queue_stopped(netdev)) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4016
			netif_wake_queue(netdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4017
			++adapter->restart_queue;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4018
		}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4019
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4020
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4021
	if (!adapter->ecdev && adapter->detect_tx_hung) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4022
		/* Detect a transmit hang in hardware, this serializes the
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4023
		 * check with the clearing of time_stamp and movement of i */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4024
		adapter->detect_tx_hung = false;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4025
		if (tx_ring->buffer_info[i].time_stamp &&
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4026
		    time_after(jiffies, tx_ring->buffer_info[i].time_stamp +
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4027
		               (adapter->tx_timeout_factor * HZ))
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4028
		    && !(er32(STATUS) & E1000_STATUS_TXOFF)) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4029
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4030
			/* detected Tx unit hang */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4031
			DPRINTK(DRV, ERR, "Detected Tx Unit Hang\n"
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4032
					"  Tx Queue             <%lu>\n"
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4033
					"  TDH                  <%x>\n"
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4034
					"  TDT                  <%x>\n"
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4035
					"  next_to_use          <%x>\n"
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4036
					"  next_to_clean        <%x>\n"
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4037
					"buffer_info[next_to_clean]\n"
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4038
					"  time_stamp           <%lx>\n"
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4039
					"  next_to_watch        <%x>\n"
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4040
					"  jiffies              <%lx>\n"
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4041
					"  next_to_watch.status <%x>\n",
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4042
				(unsigned long)((tx_ring - adapter->tx_ring) /
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4043
					sizeof(struct e1000_tx_ring)),
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4044
				readl(hw->hw_addr + tx_ring->tdh),
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4045
				readl(hw->hw_addr + tx_ring->tdt),
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4046
				tx_ring->next_to_use,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4047
				tx_ring->next_to_clean,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4048
				tx_ring->buffer_info[i].time_stamp,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4049
				eop,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4050
				jiffies,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4051
				eop_desc->upper.fields.status);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4052
			netif_stop_queue(netdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4053
		}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4054
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4055
	adapter->total_tx_bytes += total_tx_bytes;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4056
	adapter->total_tx_packets += total_tx_packets;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4057
	adapter->net_stats.tx_bytes += total_tx_bytes;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4058
	adapter->net_stats.tx_packets += total_tx_packets;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4059
	return (count < tx_ring->count);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4060
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4061
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4062
/**
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4063
 * e1000_rx_checksum - Receive Checksum Offload for 82543
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4064
 * @adapter:     board private structure
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4065
 * @status_err:  receive descriptor status and error fields
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4066
 * @csum:        receive descriptor csum field
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4067
 * @sk_buff:     socket buffer with received data
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4068
 **/
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4069
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4070
static void e1000_rx_checksum(struct e1000_adapter *adapter, u32 status_err,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4071
			      u32 csum, struct sk_buff *skb)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4072
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4073
	struct e1000_hw *hw = &adapter->hw;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4074
	u16 status = (u16)status_err;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4075
	u8 errors = (u8)(status_err >> 24);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4076
	skb->ip_summed = CHECKSUM_NONE;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4077
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4078
	/* 82543 or newer only */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4079
	if (unlikely(hw->mac_type < e1000_82543)) return;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4080
	/* Ignore Checksum bit is set */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4081
	if (unlikely(status & E1000_RXD_STAT_IXSM)) return;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4082
	/* TCP/UDP checksum error bit is set */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4083
	if (unlikely(errors & E1000_RXD_ERR_TCPE)) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4084
		/* let the stack verify checksum errors */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4085
		adapter->hw_csum_err++;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4086
		return;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4087
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4088
	/* TCP/UDP Checksum has not been calculated */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4089
	if (hw->mac_type <= e1000_82547_rev_2) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4090
		if (!(status & E1000_RXD_STAT_TCPCS))
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4091
			return;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4092
	} else {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4093
		if (!(status & (E1000_RXD_STAT_TCPCS | E1000_RXD_STAT_UDPCS)))
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4094
			return;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4095
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4096
	/* It must be a TCP or UDP packet with a valid checksum */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4097
	if (likely(status & E1000_RXD_STAT_TCPCS)) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4098
		/* TCP checksum is good */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4099
		skb->ip_summed = CHECKSUM_UNNECESSARY;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4100
	} else if (hw->mac_type > e1000_82547_rev_2) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4101
		/* IP fragment with UDP payload */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4102
		/* Hardware complements the payload checksum, so we undo it
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4103
		 * and then put the value in host order for further stack use.
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4104
		 */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4105
		__sum16 sum = (__force __sum16)htons(csum);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4106
		skb->csum = csum_unfold(~sum);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4107
		skb->ip_summed = CHECKSUM_COMPLETE;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4108
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4109
	adapter->hw_csum_good++;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4110
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4111
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4112
/**
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4113
 * e1000_clean_rx_irq - Send received data up the network stack; legacy
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4114
 * @adapter: board private structure
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4115
 **/
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4116
static bool e1000_clean_rx_irq(struct e1000_adapter *adapter,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4117
			       struct e1000_rx_ring *rx_ring,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4118
			       int *work_done, int work_to_do)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4119
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4120
	struct e1000_hw *hw = &adapter->hw;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4121
	struct net_device *netdev = adapter->netdev;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4122
	struct pci_dev *pdev = adapter->pdev;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4123
	struct e1000_rx_desc *rx_desc, *next_rxd;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4124
	struct e1000_buffer *buffer_info, *next_buffer;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4125
	unsigned long flags;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4126
	u32 length;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4127
	u8 last_byte;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4128
	unsigned int i;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4129
	int cleaned_count = 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4130
	bool cleaned = false;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4131
	unsigned int total_rx_bytes=0, total_rx_packets=0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4132
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4133
	i = rx_ring->next_to_clean;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4134
	rx_desc = E1000_RX_DESC(*rx_ring, i);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4135
	buffer_info = &rx_ring->buffer_info[i];
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4136
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4137
	while (rx_desc->status & E1000_RXD_STAT_DD) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4138
		struct sk_buff *skb;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4139
		u8 status;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4140
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4141
		if (*work_done >= work_to_do)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4142
			break;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4143
		(*work_done)++;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4144
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4145
		status = rx_desc->status;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4146
		skb = buffer_info->skb;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4147
		if (!adapter->ecdev) buffer_info->skb = NULL;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4148
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4149
		prefetch(skb->data - NET_IP_ALIGN);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4150
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4151
		if (++i == rx_ring->count) i = 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4152
		next_rxd = E1000_RX_DESC(*rx_ring, i);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4153
		prefetch(next_rxd);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4154
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4155
		next_buffer = &rx_ring->buffer_info[i];
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4156
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4157
		cleaned = true;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4158
		cleaned_count++;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4159
		pci_unmap_single(pdev,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4160
		                 buffer_info->dma,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4161
		                 buffer_info->length,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4162
		                 PCI_DMA_FROMDEVICE);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4163
		buffer_info->dma = 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4164
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4165
		length = le16_to_cpu(rx_desc->length);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4166
		/* !EOP means multiple descriptors were used to store a single
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4167
		 * packet, also make sure the frame isn't just CRC only */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4168
		if (unlikely(!(status & E1000_RXD_STAT_EOP) || (length <= 4))) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4169
			/* All receives must fit into a single buffer */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4170
			E1000_DBG("%s: Receive packet consumed multiple"
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4171
				  " buffers\n", netdev->name);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4172
			/* recycle */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4173
			buffer_info->skb = skb;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4174
			goto next_desc;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4175
		}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4176
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4177
		if (!adapter->ecdev &&
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4178
				unlikely(rx_desc->errors & E1000_RXD_ERR_FRAME_ERR_MASK)) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4179
			last_byte = *(skb->data + length - 1);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4180
			if (TBI_ACCEPT(hw, status, rx_desc->errors, length,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4181
				       last_byte)) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4182
				spin_lock_irqsave(&adapter->stats_lock, flags);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4183
				e1000_tbi_adjust_stats(hw, &adapter->stats,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4184
				                       length, skb->data);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4185
				spin_unlock_irqrestore(&adapter->stats_lock,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4186
				                       flags);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4187
				length--;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4188
			} else {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4189
				/* recycle */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4190
				buffer_info->skb = skb;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4191
				goto next_desc;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4192
			}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4193
		}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4194
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4195
		/* adjust length to remove Ethernet CRC, this must be
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4196
		 * done after the TBI_ACCEPT workaround above */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4197
		length -= 4;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4198
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4199
		/* probably a little skewed due to removing CRC */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4200
		total_rx_bytes += length;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4201
		total_rx_packets++;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4202
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4203
		/* code added for copybreak, this should improve
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4204
		 * performance for small packets with large amounts
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4205
		 * of reassembly being done in the stack */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4206
		if (!adapter->ecdev && length < copybreak) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4207
			struct sk_buff *new_skb =
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4208
			    netdev_alloc_skb(netdev, length + NET_IP_ALIGN);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4209
			if (new_skb) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4210
				skb_reserve(new_skb, NET_IP_ALIGN);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4211
				skb_copy_to_linear_data_offset(new_skb,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4212
							       -NET_IP_ALIGN,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4213
							       (skb->data -
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4214
							        NET_IP_ALIGN),
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4215
							       (length +
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4216
							        NET_IP_ALIGN));
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4217
				/* save the skb in buffer_info as good */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4218
				buffer_info->skb = skb;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4219
				skb = new_skb;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4220
			}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4221
			/* else just continue with the old one */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4222
		}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4223
		/* end copybreak code */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4224
		skb_put(skb, length);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4225
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4226
		/* Receive Checksum Offload */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4227
		e1000_rx_checksum(adapter,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4228
				  (u32)(status) |
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4229
				  ((u32)(rx_desc->errors) << 24),
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4230
				  le16_to_cpu(rx_desc->csum), skb);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4231
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4232
		if (adapter->ecdev) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4233
			ecdev_receive(adapter->ecdev, skb->data, length);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4234
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4235
			// No need to detect link status as
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4236
			// long as frames are received: Reset watchdog.
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4237
			adapter->ec_watchdog_jiffies = jiffies;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4238
		} else {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4239
			skb->protocol = eth_type_trans(skb, netdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4240
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4241
			if (unlikely(adapter->vlgrp &&
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4242
				    (status & E1000_RXD_STAT_VP))) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4243
				vlan_hwaccel_receive_skb(skb, adapter->vlgrp,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4244
							 le16_to_cpu(rx_desc->special));
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4245
			} else {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4246
				netif_receive_skb(skb);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4247
			}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4248
		}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4249
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4250
next_desc:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4251
		rx_desc->status = 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4252
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4253
		/* return some buffers to hardware, one at a time is too slow */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4254
		if (unlikely(cleaned_count >= E1000_RX_BUFFER_WRITE)) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4255
			adapter->alloc_rx_buf(adapter, rx_ring, cleaned_count);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4256
			cleaned_count = 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4257
		}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4258
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4259
		/* use prefetched values */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4260
		rx_desc = next_rxd;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4261
		buffer_info = next_buffer;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4262
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4263
	rx_ring->next_to_clean = i;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4264
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4265
	cleaned_count = E1000_DESC_UNUSED(rx_ring);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4266
	if (cleaned_count)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4267
		adapter->alloc_rx_buf(adapter, rx_ring, cleaned_count);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4268
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4269
	adapter->total_rx_packets += total_rx_packets;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4270
	adapter->total_rx_bytes += total_rx_bytes;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4271
	adapter->net_stats.rx_bytes += total_rx_bytes;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4272
	adapter->net_stats.rx_packets += total_rx_packets;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4273
	return cleaned;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4274
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4275
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4276
/**
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4277
 * e1000_alloc_rx_buffers - Replace used receive buffers; legacy & extended
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4278
 * @adapter: address of board private structure
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4279
 **/
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4280
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4281
static void e1000_alloc_rx_buffers(struct e1000_adapter *adapter,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4282
				   struct e1000_rx_ring *rx_ring,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4283
				   int cleaned_count)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4284
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4285
	struct e1000_hw *hw = &adapter->hw;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4286
	struct net_device *netdev = adapter->netdev;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4287
	struct pci_dev *pdev = adapter->pdev;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4288
	struct e1000_rx_desc *rx_desc;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4289
	struct e1000_buffer *buffer_info;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4290
	struct sk_buff *skb;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4291
	unsigned int i;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4292
	unsigned int bufsz = adapter->rx_buffer_len + NET_IP_ALIGN;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4293
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4294
	i = rx_ring->next_to_use;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4295
	buffer_info = &rx_ring->buffer_info[i];
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4296
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4297
	while (cleaned_count--) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4298
		skb = buffer_info->skb;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4299
		if (skb) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4300
			skb_trim(skb, 0);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4301
			goto map_skb;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4302
		}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4303
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4304
		skb = netdev_alloc_skb(netdev, bufsz);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4305
		if (unlikely(!skb)) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4306
			/* Better luck next round */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4307
			adapter->alloc_rx_buff_failed++;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4308
			break;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4309
		}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4310
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4311
		/* Fix for errata 23, can't cross 64kB boundary */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4312
		if (!e1000_check_64k_bound(adapter, skb->data, bufsz)) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4313
			struct sk_buff *oldskb = skb;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4314
			DPRINTK(RX_ERR, ERR, "skb align check failed: %u bytes "
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4315
					     "at %p\n", bufsz, skb->data);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4316
			/* Try again, without freeing the previous */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4317
			skb = netdev_alloc_skb(netdev, bufsz);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4318
			/* Failed allocation, critical failure */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4319
			if (!skb) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4320
				dev_kfree_skb(oldskb);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4321
				break;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4322
			}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4323
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4324
			if (!e1000_check_64k_bound(adapter, skb->data, bufsz)) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4325
				/* give up */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4326
				dev_kfree_skb(skb);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4327
				dev_kfree_skb(oldskb);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4328
				break; /* while !buffer_info->skb */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4329
			}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4330
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4331
			/* Use new allocation */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4332
			dev_kfree_skb(oldskb);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4333
		}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4334
		/* Make buffer alignment 2 beyond a 16 byte boundary
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4335
		 * this will result in a 16 byte aligned IP header after
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4336
		 * the 14 byte MAC header is removed
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4337
		 */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4338
		skb_reserve(skb, NET_IP_ALIGN);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4339
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4340
		buffer_info->skb = skb;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4341
		buffer_info->length = adapter->rx_buffer_len;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4342
map_skb:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4343
		buffer_info->dma = pci_map_single(pdev,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4344
						  skb->data,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4345
						  adapter->rx_buffer_len,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4346
						  PCI_DMA_FROMDEVICE);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4347
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4348
		/* Fix for errata 23, can't cross 64kB boundary */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4349
		if (!e1000_check_64k_bound(adapter,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4350
					(void *)(unsigned long)buffer_info->dma,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4351
					adapter->rx_buffer_len)) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4352
			DPRINTK(RX_ERR, ERR,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4353
				"dma align check failed: %u bytes at %p\n",
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4354
				adapter->rx_buffer_len,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4355
				(void *)(unsigned long)buffer_info->dma);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4356
			if (!adapter->ecdev) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4357
				dev_kfree_skb(skb);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4358
				buffer_info->skb = NULL;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4359
			}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4360
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4361
			pci_unmap_single(pdev, buffer_info->dma,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4362
					 adapter->rx_buffer_len,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4363
					 PCI_DMA_FROMDEVICE);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4364
			buffer_info->dma = 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4365
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4366
			break; /* while !buffer_info->skb */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4367
		}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4368
		rx_desc = E1000_RX_DESC(*rx_ring, i);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4369
		rx_desc->buffer_addr = cpu_to_le64(buffer_info->dma);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4370
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4371
		if (unlikely(++i == rx_ring->count))
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4372
			i = 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4373
		buffer_info = &rx_ring->buffer_info[i];
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4374
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4375
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4376
	if (likely(rx_ring->next_to_use != i)) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4377
		rx_ring->next_to_use = i;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4378
		if (unlikely(i-- == 0))
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4379
			i = (rx_ring->count - 1);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4380
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4381
		/* Force memory writes to complete before letting h/w
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4382
		 * know there are new descriptors to fetch.  (Only
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4383
		 * applicable for weak-ordered memory model archs,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4384
		 * such as IA-64). */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4385
		wmb();
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4386
		writel(i, hw->hw_addr + rx_ring->rdt);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4387
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4388
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4389
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4390
/**
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4391
 * e1000_smartspeed - Workaround for SmartSpeed on 82541 and 82547 controllers.
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4392
 * @adapter:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4393
 **/
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4394
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4395
static void e1000_smartspeed(struct e1000_adapter *adapter)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4396
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4397
	struct e1000_hw *hw = &adapter->hw;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4398
	u16 phy_status;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4399
	u16 phy_ctrl;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4400
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4401
	if ((hw->phy_type != e1000_phy_igp) || !hw->autoneg ||
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4402
	   !(hw->autoneg_advertised & ADVERTISE_1000_FULL))
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4403
		return;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4404
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4405
	if (adapter->smartspeed == 0) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4406
		/* If Master/Slave config fault is asserted twice,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4407
		 * we assume back-to-back */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4408
		e1000_read_phy_reg(hw, PHY_1000T_STATUS, &phy_status);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4409
		if (!(phy_status & SR_1000T_MS_CONFIG_FAULT)) return;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4410
		e1000_read_phy_reg(hw, PHY_1000T_STATUS, &phy_status);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4411
		if (!(phy_status & SR_1000T_MS_CONFIG_FAULT)) return;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4412
		e1000_read_phy_reg(hw, PHY_1000T_CTRL, &phy_ctrl);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4413
		if (phy_ctrl & CR_1000T_MS_ENABLE) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4414
			phy_ctrl &= ~CR_1000T_MS_ENABLE;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4415
			e1000_write_phy_reg(hw, PHY_1000T_CTRL,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4416
					    phy_ctrl);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4417
			adapter->smartspeed++;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4418
			if (!e1000_phy_setup_autoneg(hw) &&
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4419
			   !e1000_read_phy_reg(hw, PHY_CTRL,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4420
				   	       &phy_ctrl)) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4421
				phy_ctrl |= (MII_CR_AUTO_NEG_EN |
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4422
					     MII_CR_RESTART_AUTO_NEG);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4423
				e1000_write_phy_reg(hw, PHY_CTRL,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4424
						    phy_ctrl);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4425
			}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4426
		}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4427
		return;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4428
	} else if (adapter->smartspeed == E1000_SMARTSPEED_DOWNSHIFT) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4429
		/* If still no link, perhaps using 2/3 pair cable */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4430
		e1000_read_phy_reg(hw, PHY_1000T_CTRL, &phy_ctrl);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4431
		phy_ctrl |= CR_1000T_MS_ENABLE;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4432
		e1000_write_phy_reg(hw, PHY_1000T_CTRL, phy_ctrl);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4433
		if (!e1000_phy_setup_autoneg(hw) &&
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4434
		   !e1000_read_phy_reg(hw, PHY_CTRL, &phy_ctrl)) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4435
			phy_ctrl |= (MII_CR_AUTO_NEG_EN |
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4436
				     MII_CR_RESTART_AUTO_NEG);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4437
			e1000_write_phy_reg(hw, PHY_CTRL, phy_ctrl);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4438
		}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4439
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4440
	/* Restart process after E1000_SMARTSPEED_MAX iterations */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4441
	if (adapter->smartspeed++ == E1000_SMARTSPEED_MAX)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4442
		adapter->smartspeed = 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4443
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4444
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4445
/**
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4446
 * e1000_ioctl -
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4447
 * @netdev:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4448
 * @ifreq:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4449
 * @cmd:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4450
 **/
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4451
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4452
static int e1000_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4453
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4454
	switch (cmd) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4455
	case SIOCGMIIPHY:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4456
	case SIOCGMIIREG:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4457
	case SIOCSMIIREG:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4458
		return e1000_mii_ioctl(netdev, ifr, cmd);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4459
	default:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4460
		return -EOPNOTSUPP;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4461
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4462
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4463
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4464
/**
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4465
 * e1000_mii_ioctl -
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4466
 * @netdev:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4467
 * @ifreq:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4468
 * @cmd:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4469
 **/
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4470
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4471
static int e1000_mii_ioctl(struct net_device *netdev, struct ifreq *ifr,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4472
			   int cmd)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4473
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4474
	struct e1000_adapter *adapter = netdev_priv(netdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4475
	struct e1000_hw *hw = &adapter->hw;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4476
	struct mii_ioctl_data *data = if_mii(ifr);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4477
	int retval;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4478
	u16 mii_reg;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4479
	u16 spddplx;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4480
	unsigned long flags;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4481
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4482
	if (hw->media_type != e1000_media_type_copper)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4483
		return -EOPNOTSUPP;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4484
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4485
	switch (cmd) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4486
	case SIOCGMIIPHY:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4487
		data->phy_id = hw->phy_addr;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4488
		break;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4489
	case SIOCGMIIREG:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4490
		if (!capable(CAP_NET_ADMIN) || adapter->ecdev)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4491
			return -EPERM;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4492
		spin_lock_irqsave(&adapter->stats_lock, flags);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4493
		if (e1000_read_phy_reg(hw, data->reg_num & 0x1F,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4494
				   &data->val_out)) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4495
			spin_unlock_irqrestore(&adapter->stats_lock, flags);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4496
			return -EIO;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4497
		}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4498
		spin_unlock_irqrestore(&adapter->stats_lock, flags);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4499
		break;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4500
	case SIOCSMIIREG:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4501
		if (!capable(CAP_NET_ADMIN) || adapter->ecdev)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4502
			return -EPERM;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4503
		if (data->reg_num & ~(0x1F))
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4504
			return -EFAULT;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4505
		mii_reg = data->val_in;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4506
		spin_lock_irqsave(&adapter->stats_lock, flags);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4507
		if (e1000_write_phy_reg(hw, data->reg_num,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4508
					mii_reg)) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4509
			spin_unlock_irqrestore(&adapter->stats_lock, flags);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4510
			return -EIO;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4511
		}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4512
		spin_unlock_irqrestore(&adapter->stats_lock, flags);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4513
		if (hw->media_type == e1000_media_type_copper) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4514
			switch (data->reg_num) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4515
			case PHY_CTRL:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4516
				if (mii_reg & MII_CR_POWER_DOWN)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4517
					break;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4518
				if (mii_reg & MII_CR_AUTO_NEG_EN) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4519
					hw->autoneg = 1;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4520
					hw->autoneg_advertised = 0x2F;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4521
				} else {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4522
					if (mii_reg & 0x40)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4523
						spddplx = SPEED_1000;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4524
					else if (mii_reg & 0x2000)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4525
						spddplx = SPEED_100;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4526
					else
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4527
						spddplx = SPEED_10;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4528
					spddplx += (mii_reg & 0x100)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4529
						   ? DUPLEX_FULL :
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4530
						   DUPLEX_HALF;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4531
					retval = e1000_set_spd_dplx(adapter,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4532
								    spddplx);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4533
					if (retval)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4534
						return retval;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4535
				}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4536
				if (netif_running(adapter->netdev))
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4537
					e1000_reinit_locked(adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4538
				else
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4539
					e1000_reset(adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4540
				break;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4541
			case M88E1000_PHY_SPEC_CTRL:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4542
			case M88E1000_EXT_PHY_SPEC_CTRL:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4543
				if (e1000_phy_reset(hw))
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4544
					return -EIO;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4545
				break;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4546
			}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4547
		} else {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4548
			switch (data->reg_num) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4549
			case PHY_CTRL:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4550
				if (mii_reg & MII_CR_POWER_DOWN)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4551
					break;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4552
				if (netif_running(adapter->netdev))
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4553
					e1000_reinit_locked(adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4554
				else
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4555
					e1000_reset(adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4556
				break;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4557
			}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4558
		}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4559
		break;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4560
	default:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4561
		return -EOPNOTSUPP;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4562
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4563
	return E1000_SUCCESS;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4564
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4565
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4566
void e1000_pci_set_mwi(struct e1000_hw *hw)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4567
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4568
	struct e1000_adapter *adapter = hw->back;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4569
	int ret_val = pci_set_mwi(adapter->pdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4570
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4571
	if (ret_val)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4572
		DPRINTK(PROBE, ERR, "Error in setting MWI\n");
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4573
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4574
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4575
void e1000_pci_clear_mwi(struct e1000_hw *hw)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4576
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4577
	struct e1000_adapter *adapter = hw->back;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4578
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4579
	pci_clear_mwi(adapter->pdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4580
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4581
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4582
int e1000_pcix_get_mmrbc(struct e1000_hw *hw)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4583
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4584
	struct e1000_adapter *adapter = hw->back;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4585
	return pcix_get_mmrbc(adapter->pdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4586
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4587
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4588
void e1000_pcix_set_mmrbc(struct e1000_hw *hw, int mmrbc)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4589
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4590
	struct e1000_adapter *adapter = hw->back;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4591
	pcix_set_mmrbc(adapter->pdev, mmrbc);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4592
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4593
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4594
s32 e1000_read_pcie_cap_reg(struct e1000_hw *hw, u32 reg, u16 *value)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4595
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4596
    struct e1000_adapter *adapter = hw->back;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4597
    u16 cap_offset;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4598
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4599
    cap_offset = pci_find_capability(adapter->pdev, PCI_CAP_ID_EXP);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4600
    if (!cap_offset)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4601
        return -E1000_ERR_CONFIG;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4602
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4603
    pci_read_config_word(adapter->pdev, cap_offset + reg, value);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4604
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4605
    return E1000_SUCCESS;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4606
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4607
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4608
void e1000_io_write(struct e1000_hw *hw, unsigned long port, u32 value)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4609
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4610
	outl(value, port);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4611
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4612
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4613
static void e1000_vlan_rx_register(struct net_device *netdev,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4614
				   struct vlan_group *grp)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4615
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4616
	struct e1000_adapter *adapter = netdev_priv(netdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4617
	struct e1000_hw *hw = &adapter->hw;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4618
	u32 ctrl, rctl;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4619
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4620
	if (!test_bit(__E1000_DOWN, &adapter->flags))
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4621
		e1000_irq_disable(adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4622
	adapter->vlgrp = grp;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4623
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4624
	if (grp) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4625
		/* enable VLAN tag insert/strip */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4626
		ctrl = er32(CTRL);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4627
		ctrl |= E1000_CTRL_VME;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4628
		ew32(CTRL, ctrl);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4629
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4630
		if (adapter->hw.mac_type != e1000_ich8lan) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4631
			/* enable VLAN receive filtering */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4632
			rctl = er32(RCTL);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4633
			rctl &= ~E1000_RCTL_CFIEN;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4634
			ew32(RCTL, rctl);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4635
			e1000_update_mng_vlan(adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4636
		}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4637
	} else {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4638
		/* disable VLAN tag insert/strip */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4639
		ctrl = er32(CTRL);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4640
		ctrl &= ~E1000_CTRL_VME;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4641
		ew32(CTRL, ctrl);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4642
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4643
		if (adapter->hw.mac_type != e1000_ich8lan) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4644
			if (adapter->mng_vlan_id !=
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4645
			    (u16)E1000_MNG_VLAN_NONE) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4646
				e1000_vlan_rx_kill_vid(netdev,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4647
				                       adapter->mng_vlan_id);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4648
				adapter->mng_vlan_id = E1000_MNG_VLAN_NONE;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4649
			}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4650
		}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4651
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4652
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4653
	if (!test_bit(__E1000_DOWN, &adapter->flags))
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4654
		e1000_irq_enable(adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4655
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4656
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4657
static void e1000_vlan_rx_add_vid(struct net_device *netdev, u16 vid)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4658
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4659
	struct e1000_adapter *adapter = netdev_priv(netdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4660
	struct e1000_hw *hw = &adapter->hw;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4661
	u32 vfta, index;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4662
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4663
	if ((hw->mng_cookie.status &
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4664
	     E1000_MNG_DHCP_COOKIE_STATUS_VLAN_SUPPORT) &&
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4665
	    (vid == adapter->mng_vlan_id))
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4666
		return;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4667
	/* add VID to filter table */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4668
	index = (vid >> 5) & 0x7F;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4669
	vfta = E1000_READ_REG_ARRAY(hw, VFTA, index);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4670
	vfta |= (1 << (vid & 0x1F));
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4671
	e1000_write_vfta(hw, index, vfta);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4672
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4673
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4674
static void e1000_vlan_rx_kill_vid(struct net_device *netdev, u16 vid)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4675
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4676
	struct e1000_adapter *adapter = netdev_priv(netdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4677
	struct e1000_hw *hw = &adapter->hw;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4678
	u32 vfta, index;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4679
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4680
	if (!test_bit(__E1000_DOWN, &adapter->flags))
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4681
		e1000_irq_disable(adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4682
	vlan_group_set_device(adapter->vlgrp, vid, NULL);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4683
	if (!test_bit(__E1000_DOWN, &adapter->flags))
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4684
		e1000_irq_enable(adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4685
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4686
	if ((hw->mng_cookie.status &
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4687
	     E1000_MNG_DHCP_COOKIE_STATUS_VLAN_SUPPORT) &&
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4688
	    (vid == adapter->mng_vlan_id)) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4689
		/* release control to f/w */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4690
		e1000_release_hw_control(adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4691
		return;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4692
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4693
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4694
	/* remove VID from filter table */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4695
	index = (vid >> 5) & 0x7F;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4696
	vfta = E1000_READ_REG_ARRAY(hw, VFTA, index);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4697
	vfta &= ~(1 << (vid & 0x1F));
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4698
	e1000_write_vfta(hw, index, vfta);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4699
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4700
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4701
static void e1000_restore_vlan(struct e1000_adapter *adapter)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4702
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4703
	e1000_vlan_rx_register(adapter->netdev, adapter->vlgrp);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4704
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4705
	if (adapter->vlgrp) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4706
		u16 vid;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4707
		for (vid = 0; vid < VLAN_GROUP_ARRAY_LEN; vid++) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4708
			if (!vlan_group_get_device(adapter->vlgrp, vid))
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4709
				continue;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4710
			e1000_vlan_rx_add_vid(adapter->netdev, vid);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4711
		}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4712
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4713
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4714
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4715
int e1000_set_spd_dplx(struct e1000_adapter *adapter, u16 spddplx)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4716
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4717
	struct e1000_hw *hw = &adapter->hw;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4718
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4719
	hw->autoneg = 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4720
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4721
	/* Fiber NICs only allow 1000 gbps Full duplex */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4722
	if ((hw->media_type == e1000_media_type_fiber) &&
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4723
		spddplx != (SPEED_1000 + DUPLEX_FULL)) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4724
		DPRINTK(PROBE, ERR, "Unsupported Speed/Duplex configuration\n");
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4725
		return -EINVAL;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4726
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4727
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4728
	switch (spddplx) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4729
	case SPEED_10 + DUPLEX_HALF:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4730
		hw->forced_speed_duplex = e1000_10_half;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4731
		break;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4732
	case SPEED_10 + DUPLEX_FULL:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4733
		hw->forced_speed_duplex = e1000_10_full;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4734
		break;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4735
	case SPEED_100 + DUPLEX_HALF:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4736
		hw->forced_speed_duplex = e1000_100_half;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4737
		break;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4738
	case SPEED_100 + DUPLEX_FULL:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4739
		hw->forced_speed_duplex = e1000_100_full;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4740
		break;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4741
	case SPEED_1000 + DUPLEX_FULL:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4742
		hw->autoneg = 1;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4743
		hw->autoneg_advertised = ADVERTISE_1000_FULL;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4744
		break;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4745
	case SPEED_1000 + DUPLEX_HALF: /* not supported */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4746
	default:
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4747
		DPRINTK(PROBE, ERR, "Unsupported Speed/Duplex configuration\n");
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4748
		return -EINVAL;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4749
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4750
	return 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4751
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4752
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4753
static int __e1000_shutdown(struct pci_dev *pdev, bool *enable_wake)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4754
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4755
	struct net_device *netdev = pci_get_drvdata(pdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4756
	struct e1000_adapter *adapter = netdev_priv(netdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4757
	struct e1000_hw *hw = &adapter->hw;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4758
	u32 ctrl, ctrl_ext, rctl, status;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4759
	u32 wufc = adapter->wol;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4760
#ifdef CONFIG_PM
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4761
	int retval = 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4762
#endif
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4763
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4764
	if (adapter->ecdev)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4765
		return -EBUSY;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4766
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4767
	netif_device_detach(netdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4768
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4769
	if (netif_running(netdev)) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4770
		WARN_ON(test_bit(__E1000_RESETTING, &adapter->flags));
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4771
		e1000_down(adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4772
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4773
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4774
#ifdef CONFIG_PM
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4775
	retval = pci_save_state(pdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4776
	if (retval)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4777
		return retval;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4778
#endif
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4779
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4780
	status = er32(STATUS);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4781
	if (status & E1000_STATUS_LU)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4782
		wufc &= ~E1000_WUFC_LNKC;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4783
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4784
	if (wufc) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4785
		e1000_setup_rctl(adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4786
		e1000_set_rx_mode(netdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4787
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4788
		/* turn on all-multi mode if wake on multicast is enabled */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4789
		if (wufc & E1000_WUFC_MC) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4790
			rctl = er32(RCTL);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4791
			rctl |= E1000_RCTL_MPE;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4792
			ew32(RCTL, rctl);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4793
		}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4794
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4795
		if (hw->mac_type >= e1000_82540) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4796
			ctrl = er32(CTRL);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4797
			/* advertise wake from D3Cold */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4798
			#define E1000_CTRL_ADVD3WUC 0x00100000
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4799
			/* phy power management enable */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4800
			#define E1000_CTRL_EN_PHY_PWR_MGMT 0x00200000
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4801
			ctrl |= E1000_CTRL_ADVD3WUC |
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4802
				E1000_CTRL_EN_PHY_PWR_MGMT;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4803
			ew32(CTRL, ctrl);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4804
		}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4805
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4806
		if (hw->media_type == e1000_media_type_fiber ||
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4807
		   hw->media_type == e1000_media_type_internal_serdes) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4808
			/* keep the laser running in D3 */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4809
			ctrl_ext = er32(CTRL_EXT);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4810
			ctrl_ext |= E1000_CTRL_EXT_SDP7_DATA;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4811
			ew32(CTRL_EXT, ctrl_ext);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4812
		}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4813
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4814
		/* Allow time for pending master requests to run */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4815
		e1000_disable_pciex_master(hw);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4816
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4817
		ew32(WUC, E1000_WUC_PME_EN);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4818
		ew32(WUFC, wufc);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4819
	} else {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4820
		ew32(WUC, 0);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4821
		ew32(WUFC, 0);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4822
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4823
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4824
	e1000_release_manageability(adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4825
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4826
	*enable_wake = !!wufc;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4827
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4828
	/* make sure adapter isn't asleep if manageability is enabled */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4829
	if (adapter->en_mng_pt)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4830
		*enable_wake = true;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4831
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4832
	if (hw->phy_type == e1000_phy_igp_3)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4833
		e1000_phy_powerdown_workaround(hw);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4834
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4835
	if (netif_running(netdev))
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4836
		e1000_free_irq(adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4837
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4838
	/* Release control of h/w to f/w.  If f/w is AMT enabled, this
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4839
	 * would have already happened in close and is redundant. */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4840
	e1000_release_hw_control(adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4841
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4842
	pci_disable_device(pdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4843
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4844
	return 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4845
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4846
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4847
#ifdef CONFIG_PM
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4848
static int e1000_suspend(struct pci_dev *pdev, pm_message_t state)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4849
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4850
	int retval;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4851
	bool wake;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4852
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4853
	retval = __e1000_shutdown(pdev, &wake);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4854
	if (retval)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4855
		return retval;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4856
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4857
	if (wake) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4858
		pci_prepare_to_sleep(pdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4859
	} else {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4860
		pci_wake_from_d3(pdev, false);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4861
		pci_set_power_state(pdev, PCI_D3hot);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4862
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4863
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4864
	return 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4865
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4866
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4867
static int e1000_resume(struct pci_dev *pdev)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4868
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4869
	struct net_device *netdev = pci_get_drvdata(pdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4870
	struct e1000_adapter *adapter = netdev_priv(netdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4871
	struct e1000_hw *hw = &adapter->hw;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4872
	u32 err;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4873
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4874
	if (adapter->ecdev)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4875
		return -EBUSY;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4876
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4877
	pci_set_power_state(pdev, PCI_D0);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4878
	pci_restore_state(pdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4879
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4880
	if (adapter->need_ioport)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4881
		err = pci_enable_device(pdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4882
	else
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4883
		err = pci_enable_device_mem(pdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4884
	if (err) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4885
		printk(KERN_ERR "e1000: Cannot enable PCI device from suspend\n");
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4886
		return err;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4887
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4888
	pci_set_master(pdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4889
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4890
	pci_enable_wake(pdev, PCI_D3hot, 0);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4891
	pci_enable_wake(pdev, PCI_D3cold, 0);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4892
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4893
	if (netif_running(netdev)) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4894
		err = e1000_request_irq(adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4895
		if (err)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4896
			return err;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4897
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4898
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4899
	e1000_power_up_phy(adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4900
	e1000_reset(adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4901
	ew32(WUS, ~0);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4902
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4903
	e1000_init_manageability(adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4904
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4905
	if (netif_running(netdev))
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4906
		e1000_up(adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4907
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4908
	if (!adapter->ecdev) netif_device_attach(netdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4909
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4910
	/* If the controller is 82573 and f/w is AMT, do not set
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4911
	 * DRV_LOAD until the interface is up.  For all other cases,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4912
	 * let the f/w know that the h/w is now under the control
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4913
	 * of the driver. */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4914
	if (hw->mac_type != e1000_82573 ||
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4915
	    !e1000_check_mng_mode(hw))
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4916
		e1000_get_hw_control(adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4917
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4918
	return 0;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4919
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4920
#endif
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4921
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4922
static void e1000_shutdown(struct pci_dev *pdev)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4923
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4924
	bool wake;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4925
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4926
	__e1000_shutdown(pdev, &wake);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4927
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4928
	if (system_state == SYSTEM_POWER_OFF) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4929
		pci_wake_from_d3(pdev, wake);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4930
		pci_set_power_state(pdev, PCI_D3hot);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4931
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4932
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4933
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4934
#ifdef CONFIG_NET_POLL_CONTROLLER
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4935
/*
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4936
 * Polling 'interrupt' - used by things like netconsole to send skbs
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4937
 * without having to re-enable interrupts. It's not called while
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4938
 * the interrupt routine is executing.
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4939
 */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4940
static void e1000_netpoll(struct net_device *netdev)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4941
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4942
	struct e1000_adapter *adapter = netdev_priv(netdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4943
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4944
	disable_irq(adapter->pdev->irq);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4945
	e1000_intr(adapter->pdev->irq, netdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4946
	enable_irq(adapter->pdev->irq);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4947
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4948
#endif
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4949
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4950
/**
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4951
 * e1000_io_error_detected - called when PCI error is detected
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4952
 * @pdev: Pointer to PCI device
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4953
 * @state: The current pci conneection state
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4954
 *
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4955
 * This function is called after a PCI bus error affecting
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4956
 * this device has been detected.
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4957
 */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4958
static pci_ers_result_t e1000_io_error_detected(struct pci_dev *pdev,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4959
						pci_channel_state_t state)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4960
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4961
	struct net_device *netdev = pci_get_drvdata(pdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4962
	struct e1000_adapter *adapter = netdev_priv(netdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4963
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4964
	netif_device_detach(netdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4965
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4966
	if (state == pci_channel_io_perm_failure)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4967
		return PCI_ERS_RESULT_DISCONNECT;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4968
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4969
	if (netif_running(netdev))
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4970
		e1000_down(adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4971
	pci_disable_device(pdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4972
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4973
	/* Request a slot slot reset. */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4974
	return PCI_ERS_RESULT_NEED_RESET;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4975
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4976
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4977
/**
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4978
 * e1000_io_slot_reset - called after the pci bus has been reset.
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4979
 * @pdev: Pointer to PCI device
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4980
 *
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4981
 * Restart the card from scratch, as if from a cold-boot. Implementation
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4982
 * resembles the first-half of the e1000_resume routine.
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4983
 */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4984
static pci_ers_result_t e1000_io_slot_reset(struct pci_dev *pdev)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4985
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4986
	struct net_device *netdev = pci_get_drvdata(pdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4987
	struct e1000_adapter *adapter = netdev_priv(netdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4988
	struct e1000_hw *hw = &adapter->hw;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4989
	int err;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4990
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4991
	if (adapter->need_ioport)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4992
		err = pci_enable_device(pdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4993
	else
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4994
		err = pci_enable_device_mem(pdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4995
	if (err) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4996
		printk(KERN_ERR "e1000: Cannot re-enable PCI device after reset.\n");
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4997
		return PCI_ERS_RESULT_DISCONNECT;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4998
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4999
	pci_set_master(pdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  5000
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  5001
	pci_enable_wake(pdev, PCI_D3hot, 0);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  5002
	pci_enable_wake(pdev, PCI_D3cold, 0);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  5003
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  5004
	e1000_reset(adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  5005
	ew32(WUS, ~0);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  5006
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  5007
	return PCI_ERS_RESULT_RECOVERED;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  5008
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  5009
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  5010
/**
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  5011
 * e1000_io_resume - called when traffic can start flowing again.
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  5012
 * @pdev: Pointer to PCI device
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  5013
 *
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  5014
 * This callback is called when the error recovery driver tells us that
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  5015
 * its OK to resume normal operation. Implementation resembles the
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  5016
 * second-half of the e1000_resume routine.
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  5017
 */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  5018
static void e1000_io_resume(struct pci_dev *pdev)
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  5019
{
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  5020
	struct net_device *netdev = pci_get_drvdata(pdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  5021
	struct e1000_adapter *adapter = netdev_priv(netdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  5022
	struct e1000_hw *hw = &adapter->hw;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  5023
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  5024
	e1000_init_manageability(adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  5025
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  5026
	if (netif_running(netdev)) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  5027
		if (e1000_up(adapter)) {
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  5028
			printk("e1000: can't bring device back up after reset\n");
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  5029
			return;
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  5030
		}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  5031
	}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  5032
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  5033
	netif_device_attach(netdev);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  5034
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  5035
	/* If the controller is 82573 and f/w is AMT, do not set
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  5036
	 * DRV_LOAD until the interface is up.  For all other cases,
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  5037
	 * let the f/w know that the h/w is now under the control
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  5038
	 * of the driver. */
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  5039
	if (hw->mac_type != e1000_82573 ||
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  5040
	    !e1000_check_mng_mode(hw))
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  5041
		e1000_get_hw_control(adapter);
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  5042
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  5043
}
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  5044
852668fdae6a Added e1000 port for 2.6.31
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  5045
/* e1000_main.c */