devices/e1000/e1000_main-2.6.33-orig.c
author Knud Baastrup <kba@deif.com>
Tue, 14 Apr 2015 13:12:24 -0400
changeset 2629 a2701af27fde
parent 1992 b1266dd6bb2f
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.
1992
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
     1
/*******************************************************************************
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
     2
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
     3
  Intel PRO/1000 Linux driver
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
     4
  Copyright(c) 1999 - 2006 Intel Corporation.
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
     5
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
     6
  This program is free software; you can redistribute it and/or modify it
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
     7
  under the terms and conditions of the GNU General Public License,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
     8
  version 2, as published by the Free Software Foundation.
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
     9
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    10
  This program is distributed in the hope it will be useful, but WITHOUT
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    11
  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    12
  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    13
  more details.
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    14
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    15
  You should have received a copy of the GNU General Public License along with
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    16
  this program; if not, write to the Free Software Foundation, Inc.,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    17
  51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    18
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    19
  The full GNU General Public License is included in this distribution in
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    20
  the file called "COPYING".
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    21
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    22
  Contact Information:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    23
  Linux NICS <linux.nics@intel.com>
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    24
  e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    25
  Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    26
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    27
*******************************************************************************/
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    28
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    29
#include "e1000.h"
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    30
#include <net/ip6_checksum.h>
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    31
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    32
char e1000_driver_name[] = "e1000";
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    33
static char e1000_driver_string[] = "Intel(R) PRO/1000 Network Driver";
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    34
#define DRV_VERSION "7.3.21-k5-NAPI"
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    35
const char e1000_driver_version[] = DRV_VERSION;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    36
static const char e1000_copyright[] = "Copyright (c) 1999-2006 Intel Corporation.";
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    37
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    38
/* e1000_pci_tbl - PCI Device ID Table
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    39
 *
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    40
 * Last entry must be all 0s
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    41
 *
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    42
 * Macro expands to...
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    43
 *   {PCI_DEVICE(PCI_VENDOR_ID_INTEL, device_id)}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    44
 */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    45
static struct pci_device_id e1000_pci_tbl[] = {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    46
	INTEL_E1000_ETHERNET_DEVICE(0x1000),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    47
	INTEL_E1000_ETHERNET_DEVICE(0x1001),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    48
	INTEL_E1000_ETHERNET_DEVICE(0x1004),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    49
	INTEL_E1000_ETHERNET_DEVICE(0x1008),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    50
	INTEL_E1000_ETHERNET_DEVICE(0x1009),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    51
	INTEL_E1000_ETHERNET_DEVICE(0x100C),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    52
	INTEL_E1000_ETHERNET_DEVICE(0x100D),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    53
	INTEL_E1000_ETHERNET_DEVICE(0x100E),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    54
	INTEL_E1000_ETHERNET_DEVICE(0x100F),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    55
	INTEL_E1000_ETHERNET_DEVICE(0x1010),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    56
	INTEL_E1000_ETHERNET_DEVICE(0x1011),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    57
	INTEL_E1000_ETHERNET_DEVICE(0x1012),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    58
	INTEL_E1000_ETHERNET_DEVICE(0x1013),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    59
	INTEL_E1000_ETHERNET_DEVICE(0x1014),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    60
	INTEL_E1000_ETHERNET_DEVICE(0x1015),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    61
	INTEL_E1000_ETHERNET_DEVICE(0x1016),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    62
	INTEL_E1000_ETHERNET_DEVICE(0x1017),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    63
	INTEL_E1000_ETHERNET_DEVICE(0x1018),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    64
	INTEL_E1000_ETHERNET_DEVICE(0x1019),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    65
	INTEL_E1000_ETHERNET_DEVICE(0x101A),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    66
	INTEL_E1000_ETHERNET_DEVICE(0x101D),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    67
	INTEL_E1000_ETHERNET_DEVICE(0x101E),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    68
	INTEL_E1000_ETHERNET_DEVICE(0x1026),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    69
	INTEL_E1000_ETHERNET_DEVICE(0x1027),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    70
	INTEL_E1000_ETHERNET_DEVICE(0x1028),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    71
	INTEL_E1000_ETHERNET_DEVICE(0x1075),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    72
	INTEL_E1000_ETHERNET_DEVICE(0x1076),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    73
	INTEL_E1000_ETHERNET_DEVICE(0x1077),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    74
	INTEL_E1000_ETHERNET_DEVICE(0x1078),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    75
	INTEL_E1000_ETHERNET_DEVICE(0x1079),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    76
	INTEL_E1000_ETHERNET_DEVICE(0x107A),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    77
	INTEL_E1000_ETHERNET_DEVICE(0x107B),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    78
	INTEL_E1000_ETHERNET_DEVICE(0x107C),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    79
	INTEL_E1000_ETHERNET_DEVICE(0x108A),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    80
	INTEL_E1000_ETHERNET_DEVICE(0x1099),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    81
	INTEL_E1000_ETHERNET_DEVICE(0x10B5),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    82
	/* required last entry */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    83
	{0,}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    84
};
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    85
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    86
MODULE_DEVICE_TABLE(pci, e1000_pci_tbl);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    87
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    88
int e1000_up(struct e1000_adapter *adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    89
void e1000_down(struct e1000_adapter *adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    90
void e1000_reinit_locked(struct e1000_adapter *adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    91
void e1000_reset(struct e1000_adapter *adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    92
int e1000_set_spd_dplx(struct e1000_adapter *adapter, u16 spddplx);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    93
int e1000_setup_all_tx_resources(struct e1000_adapter *adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    94
int e1000_setup_all_rx_resources(struct e1000_adapter *adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    95
void e1000_free_all_tx_resources(struct e1000_adapter *adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    96
void e1000_free_all_rx_resources(struct e1000_adapter *adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    97
static int e1000_setup_tx_resources(struct e1000_adapter *adapter,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    98
                             struct e1000_tx_ring *txdr);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    99
static int e1000_setup_rx_resources(struct e1000_adapter *adapter,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   100
                             struct e1000_rx_ring *rxdr);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   101
static void e1000_free_tx_resources(struct e1000_adapter *adapter,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   102
                             struct e1000_tx_ring *tx_ring);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   103
static void e1000_free_rx_resources(struct e1000_adapter *adapter,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   104
                             struct e1000_rx_ring *rx_ring);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   105
void e1000_update_stats(struct e1000_adapter *adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   106
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   107
static int e1000_init_module(void);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   108
static void e1000_exit_module(void);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   109
static int e1000_probe(struct pci_dev *pdev, const struct pci_device_id *ent);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   110
static void __devexit e1000_remove(struct pci_dev *pdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   111
static int e1000_alloc_queues(struct e1000_adapter *adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   112
static int e1000_sw_init(struct e1000_adapter *adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   113
static int e1000_open(struct net_device *netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   114
static int e1000_close(struct net_device *netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   115
static void e1000_configure_tx(struct e1000_adapter *adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   116
static void e1000_configure_rx(struct e1000_adapter *adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   117
static void e1000_setup_rctl(struct e1000_adapter *adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   118
static void e1000_clean_all_tx_rings(struct e1000_adapter *adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   119
static void e1000_clean_all_rx_rings(struct e1000_adapter *adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   120
static void e1000_clean_tx_ring(struct e1000_adapter *adapter,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   121
                                struct e1000_tx_ring *tx_ring);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   122
static void e1000_clean_rx_ring(struct e1000_adapter *adapter,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   123
                                struct e1000_rx_ring *rx_ring);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   124
static void e1000_set_rx_mode(struct net_device *netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   125
static void e1000_update_phy_info(unsigned long data);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   126
static void e1000_watchdog(unsigned long data);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   127
static void e1000_82547_tx_fifo_stall(unsigned long data);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   128
static netdev_tx_t e1000_xmit_frame(struct sk_buff *skb,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   129
				    struct net_device *netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   130
static struct net_device_stats * e1000_get_stats(struct net_device *netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   131
static int e1000_change_mtu(struct net_device *netdev, int new_mtu);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   132
static int e1000_set_mac(struct net_device *netdev, void *p);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   133
static irqreturn_t e1000_intr(int irq, void *data);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   134
static bool e1000_clean_tx_irq(struct e1000_adapter *adapter,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   135
			       struct e1000_tx_ring *tx_ring);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   136
static int e1000_clean(struct napi_struct *napi, int budget);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   137
static bool e1000_clean_rx_irq(struct e1000_adapter *adapter,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   138
			       struct e1000_rx_ring *rx_ring,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   139
			       int *work_done, int work_to_do);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   140
static bool e1000_clean_jumbo_rx_irq(struct e1000_adapter *adapter,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   141
				     struct e1000_rx_ring *rx_ring,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   142
				     int *work_done, int work_to_do);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   143
static void e1000_alloc_rx_buffers(struct e1000_adapter *adapter,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   144
				   struct e1000_rx_ring *rx_ring,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   145
				   int cleaned_count);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   146
static void e1000_alloc_jumbo_rx_buffers(struct e1000_adapter *adapter,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   147
					 struct e1000_rx_ring *rx_ring,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   148
					 int cleaned_count);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   149
static int e1000_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   150
static int e1000_mii_ioctl(struct net_device *netdev, struct ifreq *ifr,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   151
			   int cmd);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   152
static void e1000_enter_82542_rst(struct e1000_adapter *adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   153
static void e1000_leave_82542_rst(struct e1000_adapter *adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   154
static void e1000_tx_timeout(struct net_device *dev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   155
static void e1000_reset_task(struct work_struct *work);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   156
static void e1000_smartspeed(struct e1000_adapter *adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   157
static int e1000_82547_fifo_workaround(struct e1000_adapter *adapter,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   158
                                       struct sk_buff *skb);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   159
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   160
static void e1000_vlan_rx_register(struct net_device *netdev, struct vlan_group *grp);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   161
static void e1000_vlan_rx_add_vid(struct net_device *netdev, u16 vid);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   162
static void e1000_vlan_rx_kill_vid(struct net_device *netdev, u16 vid);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   163
static void e1000_restore_vlan(struct e1000_adapter *adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   164
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   165
#ifdef CONFIG_PM
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   166
static int e1000_suspend(struct pci_dev *pdev, pm_message_t state);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   167
static int e1000_resume(struct pci_dev *pdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   168
#endif
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   169
static void e1000_shutdown(struct pci_dev *pdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   170
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   171
#ifdef CONFIG_NET_POLL_CONTROLLER
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   172
/* for netdump / net console */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   173
static void e1000_netpoll (struct net_device *netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   174
#endif
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   175
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   176
#define COPYBREAK_DEFAULT 256
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   177
static unsigned int copybreak __read_mostly = COPYBREAK_DEFAULT;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   178
module_param(copybreak, uint, 0644);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   179
MODULE_PARM_DESC(copybreak,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   180
	"Maximum size of packet that is copied to a new buffer on receive");
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   181
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   182
static pci_ers_result_t e1000_io_error_detected(struct pci_dev *pdev,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   183
                     pci_channel_state_t state);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   184
static pci_ers_result_t e1000_io_slot_reset(struct pci_dev *pdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   185
static void e1000_io_resume(struct pci_dev *pdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   186
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   187
static struct pci_error_handlers e1000_err_handler = {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   188
	.error_detected = e1000_io_error_detected,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   189
	.slot_reset = e1000_io_slot_reset,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   190
	.resume = e1000_io_resume,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   191
};
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   192
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   193
static struct pci_driver e1000_driver = {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   194
	.name     = e1000_driver_name,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   195
	.id_table = e1000_pci_tbl,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   196
	.probe    = e1000_probe,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   197
	.remove   = __devexit_p(e1000_remove),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   198
#ifdef CONFIG_PM
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   199
	/* Power Managment Hooks */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   200
	.suspend  = e1000_suspend,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   201
	.resume   = e1000_resume,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   202
#endif
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   203
	.shutdown = e1000_shutdown,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   204
	.err_handler = &e1000_err_handler
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   205
};
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   206
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   207
MODULE_AUTHOR("Intel Corporation, <linux.nics@intel.com>");
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   208
MODULE_DESCRIPTION("Intel(R) PRO/1000 Network Driver");
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   209
MODULE_LICENSE("GPL");
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   210
MODULE_VERSION(DRV_VERSION);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   211
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   212
static int debug = NETIF_MSG_DRV | NETIF_MSG_PROBE;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   213
module_param(debug, int, 0);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   214
MODULE_PARM_DESC(debug, "Debug level (0=none,...,16=all)");
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   215
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   216
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   217
 * e1000_init_module - Driver Registration Routine
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   218
 *
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   219
 * e1000_init_module is the first routine called when the driver is
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   220
 * loaded. All it does is register with the PCI subsystem.
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   221
 **/
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   222
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   223
static int __init e1000_init_module(void)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   224
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   225
	int ret;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   226
	printk(KERN_INFO "%s - version %s\n",
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   227
	       e1000_driver_string, e1000_driver_version);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   228
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   229
	printk(KERN_INFO "%s\n", e1000_copyright);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   230
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   231
	ret = pci_register_driver(&e1000_driver);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   232
	if (copybreak != COPYBREAK_DEFAULT) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   233
		if (copybreak == 0)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   234
			printk(KERN_INFO "e1000: copybreak disabled\n");
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   235
		else
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   236
			printk(KERN_INFO "e1000: copybreak enabled for "
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   237
			       "packets <= %u bytes\n", copybreak);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   238
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   239
	return ret;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   240
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   241
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   242
module_init(e1000_init_module);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   243
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   244
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   245
 * e1000_exit_module - Driver Exit Cleanup Routine
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   246
 *
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   247
 * e1000_exit_module is called just before the driver is removed
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   248
 * from memory.
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   249
 **/
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   250
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   251
static void __exit e1000_exit_module(void)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   252
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   253
	pci_unregister_driver(&e1000_driver);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   254
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   255
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   256
module_exit(e1000_exit_module);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   257
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   258
static int e1000_request_irq(struct e1000_adapter *adapter)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   259
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   260
	struct net_device *netdev = adapter->netdev;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   261
	irq_handler_t handler = e1000_intr;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   262
	int irq_flags = IRQF_SHARED;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   263
	int err;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   264
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   265
	err = request_irq(adapter->pdev->irq, handler, irq_flags, netdev->name,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   266
	                  netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   267
	if (err) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   268
		DPRINTK(PROBE, ERR,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   269
		        "Unable to allocate interrupt Error: %d\n", err);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   270
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   271
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   272
	return err;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   273
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   274
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   275
static void e1000_free_irq(struct e1000_adapter *adapter)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   276
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   277
	struct net_device *netdev = adapter->netdev;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   278
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   279
	free_irq(adapter->pdev->irq, netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   280
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   281
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   282
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   283
 * e1000_irq_disable - Mask off interrupt generation on the NIC
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   284
 * @adapter: board private structure
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   285
 **/
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   286
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   287
static void e1000_irq_disable(struct e1000_adapter *adapter)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   288
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   289
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   290
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   291
	ew32(IMC, ~0);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   292
	E1000_WRITE_FLUSH();
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   293
	synchronize_irq(adapter->pdev->irq);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   294
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   295
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   296
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   297
 * e1000_irq_enable - Enable default interrupt generation settings
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   298
 * @adapter: board private structure
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   299
 **/
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   300
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   301
static void e1000_irq_enable(struct e1000_adapter *adapter)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   302
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   303
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   304
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   305
	ew32(IMS, IMS_ENABLE_MASK);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   306
	E1000_WRITE_FLUSH();
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   307
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   308
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   309
static void e1000_update_mng_vlan(struct e1000_adapter *adapter)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   310
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   311
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   312
	struct net_device *netdev = adapter->netdev;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   313
	u16 vid = hw->mng_cookie.vlan_id;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   314
	u16 old_vid = adapter->mng_vlan_id;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   315
	if (adapter->vlgrp) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   316
		if (!vlan_group_get_device(adapter->vlgrp, vid)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   317
			if (hw->mng_cookie.status &
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   318
				E1000_MNG_DHCP_COOKIE_STATUS_VLAN_SUPPORT) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   319
				e1000_vlan_rx_add_vid(netdev, vid);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   320
				adapter->mng_vlan_id = vid;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   321
			} else
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   322
				adapter->mng_vlan_id = E1000_MNG_VLAN_NONE;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   323
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   324
			if ((old_vid != (u16)E1000_MNG_VLAN_NONE) &&
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   325
					(vid != old_vid) &&
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   326
			    !vlan_group_get_device(adapter->vlgrp, old_vid))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   327
				e1000_vlan_rx_kill_vid(netdev, old_vid);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   328
		} else
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   329
			adapter->mng_vlan_id = vid;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   330
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   331
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   332
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   333
static void e1000_init_manageability(struct e1000_adapter *adapter)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   334
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   335
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   336
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   337
	if (adapter->en_mng_pt) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   338
		u32 manc = er32(MANC);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   339
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   340
		/* disable hardware interception of ARP */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   341
		manc &= ~(E1000_MANC_ARP_EN);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   342
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   343
		ew32(MANC, manc);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   344
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   345
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   346
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   347
static void e1000_release_manageability(struct e1000_adapter *adapter)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   348
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   349
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   350
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   351
	if (adapter->en_mng_pt) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   352
		u32 manc = er32(MANC);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   353
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   354
		/* re-enable hardware interception of ARP */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   355
		manc |= E1000_MANC_ARP_EN;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   356
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   357
		ew32(MANC, manc);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   358
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   359
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   360
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   361
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   362
 * e1000_configure - configure the hardware for RX and TX
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   363
 * @adapter = private board structure
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   364
 **/
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   365
static void e1000_configure(struct e1000_adapter *adapter)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   366
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   367
	struct net_device *netdev = adapter->netdev;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   368
	int i;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   369
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   370
	e1000_set_rx_mode(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   371
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   372
	e1000_restore_vlan(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   373
	e1000_init_manageability(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   374
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   375
	e1000_configure_tx(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   376
	e1000_setup_rctl(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   377
	e1000_configure_rx(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   378
	/* call E1000_DESC_UNUSED which always leaves
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   379
	 * at least 1 descriptor unused to make sure
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   380
	 * next_to_use != next_to_clean */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   381
	for (i = 0; i < adapter->num_rx_queues; i++) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   382
		struct e1000_rx_ring *ring = &adapter->rx_ring[i];
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   383
		adapter->alloc_rx_buf(adapter, ring,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   384
		                      E1000_DESC_UNUSED(ring));
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   385
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   386
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   387
	adapter->tx_queue_len = netdev->tx_queue_len;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   388
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   389
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   390
int e1000_up(struct e1000_adapter *adapter)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   391
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   392
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   393
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   394
	/* hardware has been reset, we need to reload some things */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   395
	e1000_configure(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   396
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   397
	clear_bit(__E1000_DOWN, &adapter->flags);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   398
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   399
	napi_enable(&adapter->napi);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   400
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   401
	e1000_irq_enable(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   402
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   403
	netif_wake_queue(adapter->netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   404
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   405
	/* fire a link change interrupt to start the watchdog */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   406
	ew32(ICS, E1000_ICS_LSC);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   407
	return 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   408
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   409
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   410
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   411
 * e1000_power_up_phy - restore link in case the phy was powered down
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   412
 * @adapter: address of board private structure
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   413
 *
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   414
 * The phy may be powered down to save power and turn off link when the
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   415
 * driver is unloaded and wake on lan is not enabled (among others)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   416
 * *** this routine MUST be followed by a call to e1000_reset ***
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   417
 *
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   418
 **/
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   419
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   420
void e1000_power_up_phy(struct e1000_adapter *adapter)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   421
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   422
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   423
	u16 mii_reg = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   424
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   425
	/* Just clear the power down bit to wake the phy back up */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   426
	if (hw->media_type == e1000_media_type_copper) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   427
		/* according to the manual, the phy will retain its
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   428
		 * settings across a power-down/up cycle */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   429
		e1000_read_phy_reg(hw, PHY_CTRL, &mii_reg);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   430
		mii_reg &= ~MII_CR_POWER_DOWN;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   431
		e1000_write_phy_reg(hw, PHY_CTRL, mii_reg);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   432
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   433
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   434
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   435
static void e1000_power_down_phy(struct e1000_adapter *adapter)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   436
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   437
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   438
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   439
	/* Power down the PHY so no link is implied when interface is down *
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   440
	 * The PHY cannot be powered down if any of the following is true *
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   441
	 * (a) WoL is enabled
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   442
	 * (b) AMT is active
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   443
	 * (c) SoL/IDER session is active */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   444
	if (!adapter->wol && hw->mac_type >= e1000_82540 &&
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   445
	   hw->media_type == e1000_media_type_copper) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   446
		u16 mii_reg = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   447
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   448
		switch (hw->mac_type) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   449
		case e1000_82540:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   450
		case e1000_82545:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   451
		case e1000_82545_rev_3:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   452
		case e1000_82546:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   453
		case e1000_82546_rev_3:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   454
		case e1000_82541:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   455
		case e1000_82541_rev_2:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   456
		case e1000_82547:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   457
		case e1000_82547_rev_2:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   458
			if (er32(MANC) & E1000_MANC_SMBUS_EN)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   459
				goto out;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   460
			break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   461
		default:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   462
			goto out;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   463
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   464
		e1000_read_phy_reg(hw, PHY_CTRL, &mii_reg);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   465
		mii_reg |= MII_CR_POWER_DOWN;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   466
		e1000_write_phy_reg(hw, PHY_CTRL, mii_reg);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   467
		mdelay(1);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   468
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   469
out:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   470
	return;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   471
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   472
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   473
void e1000_down(struct e1000_adapter *adapter)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   474
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   475
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   476
	struct net_device *netdev = adapter->netdev;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   477
	u32 rctl, tctl;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   478
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   479
	/* signal that we're down so the interrupt handler does not
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   480
	 * reschedule our watchdog timer */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   481
	set_bit(__E1000_DOWN, &adapter->flags);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   482
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   483
	/* disable receives in the hardware */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   484
	rctl = er32(RCTL);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   485
	ew32(RCTL, rctl & ~E1000_RCTL_EN);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   486
	/* flush and sleep below */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   487
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   488
	netif_tx_disable(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   489
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   490
	/* disable transmits in the hardware */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   491
	tctl = er32(TCTL);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   492
	tctl &= ~E1000_TCTL_EN;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   493
	ew32(TCTL, tctl);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   494
	/* flush both disables and wait for them to finish */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   495
	E1000_WRITE_FLUSH();
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   496
	msleep(10);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   497
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   498
	napi_disable(&adapter->napi);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   499
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   500
	e1000_irq_disable(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   501
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   502
	del_timer_sync(&adapter->tx_fifo_stall_timer);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   503
	del_timer_sync(&adapter->watchdog_timer);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   504
	del_timer_sync(&adapter->phy_info_timer);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   505
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   506
	netdev->tx_queue_len = adapter->tx_queue_len;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   507
	adapter->link_speed = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   508
	adapter->link_duplex = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   509
	netif_carrier_off(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   510
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   511
	e1000_reset(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   512
	e1000_clean_all_tx_rings(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   513
	e1000_clean_all_rx_rings(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   514
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   515
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   516
void e1000_reinit_locked(struct e1000_adapter *adapter)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   517
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   518
	WARN_ON(in_interrupt());
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   519
	while (test_and_set_bit(__E1000_RESETTING, &adapter->flags))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   520
		msleep(1);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   521
	e1000_down(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   522
	e1000_up(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   523
	clear_bit(__E1000_RESETTING, &adapter->flags);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   524
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   525
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   526
void e1000_reset(struct e1000_adapter *adapter)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   527
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   528
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   529
	u32 pba = 0, tx_space, min_tx_space, min_rx_space;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   530
	bool legacy_pba_adjust = false;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   531
	u16 hwm;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   532
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   533
	/* Repartition Pba for greater than 9k mtu
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   534
	 * To take effect CTRL.RST is required.
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   535
	 */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   536
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   537
	switch (hw->mac_type) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   538
	case e1000_82542_rev2_0:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   539
	case e1000_82542_rev2_1:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   540
	case e1000_82543:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   541
	case e1000_82544:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   542
	case e1000_82540:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   543
	case e1000_82541:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   544
	case e1000_82541_rev_2:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   545
		legacy_pba_adjust = true;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   546
		pba = E1000_PBA_48K;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   547
		break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   548
	case e1000_82545:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   549
	case e1000_82545_rev_3:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   550
	case e1000_82546:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   551
	case e1000_82546_rev_3:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   552
		pba = E1000_PBA_48K;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   553
		break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   554
	case e1000_82547:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   555
	case e1000_82547_rev_2:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   556
		legacy_pba_adjust = true;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   557
		pba = E1000_PBA_30K;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   558
		break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   559
	case e1000_undefined:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   560
	case e1000_num_macs:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   561
		break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   562
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   563
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   564
	if (legacy_pba_adjust) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   565
		if (hw->max_frame_size > E1000_RXBUFFER_8192)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   566
			pba -= 8; /* allocate more FIFO for Tx */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   567
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   568
		if (hw->mac_type == e1000_82547) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   569
			adapter->tx_fifo_head = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   570
			adapter->tx_head_addr = pba << E1000_TX_HEAD_ADDR_SHIFT;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   571
			adapter->tx_fifo_size =
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   572
				(E1000_PBA_40K - pba) << E1000_PBA_BYTES_SHIFT;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   573
			atomic_set(&adapter->tx_fifo_stall, 0);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   574
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   575
	} else if (hw->max_frame_size >  ETH_FRAME_LEN + ETH_FCS_LEN) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   576
		/* adjust PBA for jumbo frames */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   577
		ew32(PBA, pba);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   578
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   579
		/* To maintain wire speed transmits, the Tx FIFO should be
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   580
		 * large enough to accommodate two full transmit packets,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   581
		 * rounded up to the next 1KB and expressed in KB.  Likewise,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   582
		 * the Rx FIFO should be large enough to accommodate at least
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   583
		 * one full receive packet and is similarly rounded up and
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   584
		 * expressed in KB. */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   585
		pba = er32(PBA);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   586
		/* upper 16 bits has Tx packet buffer allocation size in KB */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   587
		tx_space = pba >> 16;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   588
		/* lower 16 bits has Rx packet buffer allocation size in KB */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   589
		pba &= 0xffff;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   590
		/*
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   591
		 * the tx fifo also stores 16 bytes of information about the tx
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   592
		 * but don't include ethernet FCS because hardware appends it
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   593
		 */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   594
		min_tx_space = (hw->max_frame_size +
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   595
		                sizeof(struct e1000_tx_desc) -
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   596
		                ETH_FCS_LEN) * 2;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   597
		min_tx_space = ALIGN(min_tx_space, 1024);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   598
		min_tx_space >>= 10;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   599
		/* software strips receive CRC, so leave room for it */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   600
		min_rx_space = hw->max_frame_size;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   601
		min_rx_space = ALIGN(min_rx_space, 1024);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   602
		min_rx_space >>= 10;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   603
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   604
		/* If current Tx allocation is less than the min Tx FIFO size,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   605
		 * and the min Tx FIFO size is less than the current Rx FIFO
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   606
		 * allocation, take space away from current Rx allocation */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   607
		if (tx_space < min_tx_space &&
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   608
		    ((min_tx_space - tx_space) < pba)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   609
			pba = pba - (min_tx_space - tx_space);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   610
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   611
			/* PCI/PCIx hardware has PBA alignment constraints */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   612
			switch (hw->mac_type) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   613
			case e1000_82545 ... e1000_82546_rev_3:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   614
				pba &= ~(E1000_PBA_8K - 1);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   615
				break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   616
			default:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   617
				break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   618
			}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   619
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   620
			/* if short on rx space, rx wins and must trump tx
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   621
			 * adjustment or use Early Receive if available */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   622
			if (pba < min_rx_space)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   623
				pba = min_rx_space;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   624
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   625
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   626
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   627
	ew32(PBA, pba);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   628
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   629
	/*
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   630
	 * flow control settings:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   631
	 * The high water mark must be low enough to fit one full frame
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   632
	 * (or the size used for early receive) above it in the Rx FIFO.
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   633
	 * Set it to the lower of:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   634
	 * - 90% of the Rx FIFO size, and
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   635
	 * - the full Rx FIFO size minus the early receive size (for parts
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   636
	 *   with ERT support assuming ERT set to E1000_ERT_2048), or
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   637
	 * - the full Rx FIFO size minus one full frame
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   638
	 */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   639
	hwm = min(((pba << 10) * 9 / 10),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   640
		  ((pba << 10) - hw->max_frame_size));
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   641
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   642
	hw->fc_high_water = hwm & 0xFFF8;	/* 8-byte granularity */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   643
	hw->fc_low_water = hw->fc_high_water - 8;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   644
	hw->fc_pause_time = E1000_FC_PAUSE_TIME;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   645
	hw->fc_send_xon = 1;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   646
	hw->fc = hw->original_fc;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   647
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   648
	/* Allow time for pending master requests to run */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   649
	e1000_reset_hw(hw);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   650
	if (hw->mac_type >= e1000_82544)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   651
		ew32(WUC, 0);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   652
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   653
	if (e1000_init_hw(hw))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   654
		DPRINTK(PROBE, ERR, "Hardware Error\n");
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   655
	e1000_update_mng_vlan(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   656
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   657
	/* if (adapter->hwflags & HWFLAGS_PHY_PWR_BIT) { */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   658
	if (hw->mac_type >= e1000_82544 &&
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   659
	    hw->autoneg == 1 &&
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   660
	    hw->autoneg_advertised == ADVERTISE_1000_FULL) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   661
		u32 ctrl = er32(CTRL);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   662
		/* clear phy power management bit if we are in gig only mode,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   663
		 * which if enabled will attempt negotiation to 100Mb, which
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   664
		 * can cause a loss of link at power off or driver unload */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   665
		ctrl &= ~E1000_CTRL_SWDPIN3;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   666
		ew32(CTRL, ctrl);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   667
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   668
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   669
	/* Enable h/w to recognize an 802.1Q VLAN Ethernet packet */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   670
	ew32(VET, ETHERNET_IEEE_VLAN_TYPE);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   671
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   672
	e1000_reset_adaptive(hw);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   673
	e1000_phy_get_info(hw, &adapter->phy_info);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   674
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   675
	e1000_release_manageability(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   676
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   677
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   678
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   679
 *  Dump the eeprom for users having checksum issues
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   680
 **/
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   681
static void e1000_dump_eeprom(struct e1000_adapter *adapter)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   682
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   683
	struct net_device *netdev = adapter->netdev;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   684
	struct ethtool_eeprom eeprom;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   685
	const struct ethtool_ops *ops = netdev->ethtool_ops;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   686
	u8 *data;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   687
	int i;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   688
	u16 csum_old, csum_new = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   689
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   690
	eeprom.len = ops->get_eeprom_len(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   691
	eeprom.offset = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   692
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   693
	data = kmalloc(eeprom.len, GFP_KERNEL);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   694
	if (!data) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   695
		printk(KERN_ERR "Unable to allocate memory to dump EEPROM"
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   696
		       " data\n");
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   697
		return;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   698
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   699
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   700
	ops->get_eeprom(netdev, &eeprom, data);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   701
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   702
	csum_old = (data[EEPROM_CHECKSUM_REG * 2]) +
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   703
		   (data[EEPROM_CHECKSUM_REG * 2 + 1] << 8);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   704
	for (i = 0; i < EEPROM_CHECKSUM_REG * 2; i += 2)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   705
		csum_new += data[i] + (data[i + 1] << 8);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   706
	csum_new = EEPROM_SUM - csum_new;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   707
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   708
	printk(KERN_ERR "/*********************/\n");
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   709
	printk(KERN_ERR "Current EEPROM Checksum : 0x%04x\n", csum_old);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   710
	printk(KERN_ERR "Calculated              : 0x%04x\n", csum_new);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   711
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   712
	printk(KERN_ERR "Offset    Values\n");
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   713
	printk(KERN_ERR "========  ======\n");
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   714
	print_hex_dump(KERN_ERR, "", DUMP_PREFIX_OFFSET, 16, 1, data, 128, 0);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   715
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   716
	printk(KERN_ERR "Include this output when contacting your support "
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   717
	       "provider.\n");
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   718
	printk(KERN_ERR "This is not a software error! Something bad "
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   719
	       "happened to your hardware or\n");
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   720
	printk(KERN_ERR "EEPROM image. Ignoring this "
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   721
	       "problem could result in further problems,\n");
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   722
	printk(KERN_ERR "possibly loss of data, corruption or system hangs!\n");
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   723
	printk(KERN_ERR "The MAC Address will be reset to 00:00:00:00:00:00, "
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   724
	       "which is invalid\n");
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   725
	printk(KERN_ERR "and requires you to set the proper MAC "
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   726
	       "address manually before continuing\n");
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   727
	printk(KERN_ERR "to enable this network device.\n");
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   728
	printk(KERN_ERR "Please inspect the EEPROM dump and report the issue "
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   729
	       "to your hardware vendor\n");
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   730
	printk(KERN_ERR "or Intel Customer Support.\n");
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   731
	printk(KERN_ERR "/*********************/\n");
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   732
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   733
	kfree(data);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   734
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   735
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   736
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   737
 * e1000_is_need_ioport - determine if an adapter needs ioport resources or not
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   738
 * @pdev: PCI device information struct
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   739
 *
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   740
 * Return true if an adapter needs ioport resources
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   741
 **/
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   742
static int e1000_is_need_ioport(struct pci_dev *pdev)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   743
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   744
	switch (pdev->device) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   745
	case E1000_DEV_ID_82540EM:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   746
	case E1000_DEV_ID_82540EM_LOM:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   747
	case E1000_DEV_ID_82540EP:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   748
	case E1000_DEV_ID_82540EP_LOM:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   749
	case E1000_DEV_ID_82540EP_LP:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   750
	case E1000_DEV_ID_82541EI:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   751
	case E1000_DEV_ID_82541EI_MOBILE:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   752
	case E1000_DEV_ID_82541ER:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   753
	case E1000_DEV_ID_82541ER_LOM:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   754
	case E1000_DEV_ID_82541GI:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   755
	case E1000_DEV_ID_82541GI_LF:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   756
	case E1000_DEV_ID_82541GI_MOBILE:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   757
	case E1000_DEV_ID_82544EI_COPPER:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   758
	case E1000_DEV_ID_82544EI_FIBER:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   759
	case E1000_DEV_ID_82544GC_COPPER:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   760
	case E1000_DEV_ID_82544GC_LOM:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   761
	case E1000_DEV_ID_82545EM_COPPER:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   762
	case E1000_DEV_ID_82545EM_FIBER:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   763
	case E1000_DEV_ID_82546EB_COPPER:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   764
	case E1000_DEV_ID_82546EB_FIBER:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   765
	case E1000_DEV_ID_82546EB_QUAD_COPPER:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   766
		return true;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   767
	default:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   768
		return false;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   769
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   770
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   771
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   772
static const struct net_device_ops e1000_netdev_ops = {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   773
	.ndo_open		= e1000_open,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   774
	.ndo_stop		= e1000_close,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   775
	.ndo_start_xmit		= e1000_xmit_frame,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   776
	.ndo_get_stats		= e1000_get_stats,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   777
	.ndo_set_rx_mode	= e1000_set_rx_mode,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   778
	.ndo_set_mac_address	= e1000_set_mac,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   779
	.ndo_tx_timeout 	= e1000_tx_timeout,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   780
	.ndo_change_mtu		= e1000_change_mtu,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   781
	.ndo_do_ioctl		= e1000_ioctl,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   782
	.ndo_validate_addr	= eth_validate_addr,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   783
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   784
	.ndo_vlan_rx_register	= e1000_vlan_rx_register,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   785
	.ndo_vlan_rx_add_vid	= e1000_vlan_rx_add_vid,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   786
	.ndo_vlan_rx_kill_vid	= e1000_vlan_rx_kill_vid,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   787
#ifdef CONFIG_NET_POLL_CONTROLLER
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   788
	.ndo_poll_controller	= e1000_netpoll,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   789
#endif
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   790
};
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   791
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   792
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   793
 * e1000_probe - Device Initialization Routine
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   794
 * @pdev: PCI device information struct
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   795
 * @ent: entry in e1000_pci_tbl
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   796
 *
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   797
 * Returns 0 on success, negative on failure
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   798
 *
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   799
 * e1000_probe initializes an adapter identified by a pci_dev structure.
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   800
 * The OS initialization, configuring of the adapter private structure,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   801
 * and a hardware reset occur.
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   802
 **/
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   803
static int __devinit e1000_probe(struct pci_dev *pdev,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   804
				 const struct pci_device_id *ent)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   805
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   806
	struct net_device *netdev;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   807
	struct e1000_adapter *adapter;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   808
	struct e1000_hw *hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   809
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   810
	static int cards_found = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   811
	static int global_quad_port_a = 0; /* global ksp3 port a indication */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   812
	int i, err, pci_using_dac;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   813
	u16 eeprom_data = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   814
	u16 eeprom_apme_mask = E1000_EEPROM_APME;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   815
	int bars, need_ioport;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   816
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   817
	/* do not allocate ioport bars when not needed */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   818
	need_ioport = e1000_is_need_ioport(pdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   819
	if (need_ioport) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   820
		bars = pci_select_bars(pdev, IORESOURCE_MEM | IORESOURCE_IO);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   821
		err = pci_enable_device(pdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   822
	} else {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   823
		bars = pci_select_bars(pdev, IORESOURCE_MEM);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   824
		err = pci_enable_device_mem(pdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   825
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   826
	if (err)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   827
		return err;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   828
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   829
	if (!pci_set_dma_mask(pdev, DMA_BIT_MASK(64)) &&
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   830
	    !pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64))) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   831
		pci_using_dac = 1;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   832
	} else {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   833
		err = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   834
		if (err) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   835
			err = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32));
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   836
			if (err) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   837
				E1000_ERR("No usable DMA configuration, "
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   838
					  "aborting\n");
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   839
				goto err_dma;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   840
			}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   841
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   842
		pci_using_dac = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   843
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   844
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   845
	err = pci_request_selected_regions(pdev, bars, e1000_driver_name);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   846
	if (err)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   847
		goto err_pci_reg;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   848
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   849
	pci_set_master(pdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   850
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   851
	err = -ENOMEM;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   852
	netdev = alloc_etherdev(sizeof(struct e1000_adapter));
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   853
	if (!netdev)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   854
		goto err_alloc_etherdev;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   855
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   856
	SET_NETDEV_DEV(netdev, &pdev->dev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   857
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   858
	pci_set_drvdata(pdev, netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   859
	adapter = netdev_priv(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   860
	adapter->netdev = netdev;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   861
	adapter->pdev = pdev;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   862
	adapter->msg_enable = (1 << debug) - 1;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   863
	adapter->bars = bars;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   864
	adapter->need_ioport = need_ioport;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   865
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   866
	hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   867
	hw->back = adapter;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   868
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   869
	err = -EIO;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   870
	hw->hw_addr = pci_ioremap_bar(pdev, BAR_0);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   871
	if (!hw->hw_addr)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   872
		goto err_ioremap;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   873
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   874
	if (adapter->need_ioport) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   875
		for (i = BAR_1; i <= BAR_5; i++) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   876
			if (pci_resource_len(pdev, i) == 0)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   877
				continue;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   878
			if (pci_resource_flags(pdev, i) & IORESOURCE_IO) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   879
				hw->io_base = pci_resource_start(pdev, i);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   880
				break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   881
			}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   882
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   883
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   884
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   885
	netdev->netdev_ops = &e1000_netdev_ops;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   886
	e1000_set_ethtool_ops(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   887
	netdev->watchdog_timeo = 5 * HZ;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   888
	netif_napi_add(netdev, &adapter->napi, e1000_clean, 64);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   889
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   890
	strncpy(netdev->name, pci_name(pdev), sizeof(netdev->name) - 1);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   891
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   892
	adapter->bd_number = cards_found;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   893
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   894
	/* setup the private structure */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   895
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   896
	err = e1000_sw_init(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   897
	if (err)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   898
		goto err_sw_init;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   899
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   900
	err = -EIO;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   901
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   902
	if (hw->mac_type >= e1000_82543) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   903
		netdev->features = NETIF_F_SG |
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   904
				   NETIF_F_HW_CSUM |
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   905
				   NETIF_F_HW_VLAN_TX |
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   906
				   NETIF_F_HW_VLAN_RX |
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   907
				   NETIF_F_HW_VLAN_FILTER;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   908
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   909
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   910
	if ((hw->mac_type >= e1000_82544) &&
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   911
	   (hw->mac_type != e1000_82547))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   912
		netdev->features |= NETIF_F_TSO;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   913
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   914
	if (pci_using_dac)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   915
		netdev->features |= NETIF_F_HIGHDMA;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   916
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   917
	netdev->vlan_features |= NETIF_F_TSO;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   918
	netdev->vlan_features |= NETIF_F_HW_CSUM;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   919
	netdev->vlan_features |= NETIF_F_SG;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   920
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   921
	adapter->en_mng_pt = e1000_enable_mng_pass_thru(hw);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   922
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   923
	/* initialize eeprom parameters */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   924
	if (e1000_init_eeprom_params(hw)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   925
		E1000_ERR("EEPROM initialization failed\n");
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   926
		goto err_eeprom;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   927
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   928
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   929
	/* before reading the EEPROM, reset the controller to
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   930
	 * put the device in a known good starting state */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   931
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   932
	e1000_reset_hw(hw);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   933
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   934
	/* make sure the EEPROM is good */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   935
	if (e1000_validate_eeprom_checksum(hw) < 0) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   936
		DPRINTK(PROBE, ERR, "The EEPROM Checksum Is Not Valid\n");
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   937
		e1000_dump_eeprom(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   938
		/*
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   939
		 * set MAC address to all zeroes to invalidate and temporary
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   940
		 * disable this device for the user. This blocks regular
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   941
		 * traffic while still permitting ethtool ioctls from reaching
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   942
		 * the hardware as well as allowing the user to run the
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   943
		 * interface after manually setting a hw addr using
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   944
		 * `ip set address`
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   945
		 */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   946
		memset(hw->mac_addr, 0, netdev->addr_len);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   947
	} else {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   948
		/* copy the MAC address out of the EEPROM */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   949
		if (e1000_read_mac_addr(hw))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   950
			DPRINTK(PROBE, ERR, "EEPROM Read Error\n");
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   951
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   952
	/* don't block initalization here due to bad MAC address */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   953
	memcpy(netdev->dev_addr, hw->mac_addr, netdev->addr_len);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   954
	memcpy(netdev->perm_addr, hw->mac_addr, netdev->addr_len);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   955
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   956
	if (!is_valid_ether_addr(netdev->perm_addr))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   957
		DPRINTK(PROBE, ERR, "Invalid MAC Address\n");
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   958
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   959
	e1000_get_bus_info(hw);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   960
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   961
	init_timer(&adapter->tx_fifo_stall_timer);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   962
	adapter->tx_fifo_stall_timer.function = &e1000_82547_tx_fifo_stall;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   963
	adapter->tx_fifo_stall_timer.data = (unsigned long)adapter;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   964
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   965
	init_timer(&adapter->watchdog_timer);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   966
	adapter->watchdog_timer.function = &e1000_watchdog;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   967
	adapter->watchdog_timer.data = (unsigned long) adapter;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   968
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   969
	init_timer(&adapter->phy_info_timer);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   970
	adapter->phy_info_timer.function = &e1000_update_phy_info;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   971
	adapter->phy_info_timer.data = (unsigned long)adapter;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   972
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   973
	INIT_WORK(&adapter->reset_task, e1000_reset_task);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   974
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   975
	e1000_check_options(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   976
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   977
	/* Initial Wake on LAN setting
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   978
	 * If APM wake is enabled in the EEPROM,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   979
	 * enable the ACPI Magic Packet filter
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   980
	 */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   981
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   982
	switch (hw->mac_type) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   983
	case e1000_82542_rev2_0:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   984
	case e1000_82542_rev2_1:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   985
	case e1000_82543:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   986
		break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   987
	case e1000_82544:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   988
		e1000_read_eeprom(hw,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   989
			EEPROM_INIT_CONTROL2_REG, 1, &eeprom_data);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   990
		eeprom_apme_mask = E1000_EEPROM_82544_APM;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   991
		break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   992
	case e1000_82546:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   993
	case e1000_82546_rev_3:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   994
		if (er32(STATUS) & E1000_STATUS_FUNC_1){
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   995
			e1000_read_eeprom(hw,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   996
				EEPROM_INIT_CONTROL3_PORT_B, 1, &eeprom_data);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   997
			break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   998
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   999
		/* Fall Through */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1000
	default:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1001
		e1000_read_eeprom(hw,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1002
			EEPROM_INIT_CONTROL3_PORT_A, 1, &eeprom_data);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1003
		break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1004
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1005
	if (eeprom_data & eeprom_apme_mask)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1006
		adapter->eeprom_wol |= E1000_WUFC_MAG;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1007
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1008
	/* now that we have the eeprom settings, apply the special cases
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1009
	 * where the eeprom may be wrong or the board simply won't support
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1010
	 * wake on lan on a particular port */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1011
	switch (pdev->device) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1012
	case E1000_DEV_ID_82546GB_PCIE:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1013
		adapter->eeprom_wol = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1014
		break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1015
	case E1000_DEV_ID_82546EB_FIBER:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1016
	case E1000_DEV_ID_82546GB_FIBER:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1017
		/* Wake events only supported on port A for dual fiber
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1018
		 * regardless of eeprom setting */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1019
		if (er32(STATUS) & E1000_STATUS_FUNC_1)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1020
			adapter->eeprom_wol = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1021
		break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1022
	case E1000_DEV_ID_82546GB_QUAD_COPPER_KSP3:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1023
		/* if quad port adapter, disable WoL on all but port A */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1024
		if (global_quad_port_a != 0)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1025
			adapter->eeprom_wol = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1026
		else
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1027
			adapter->quad_port_a = 1;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1028
		/* Reset for multiple quad port adapters */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1029
		if (++global_quad_port_a == 4)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1030
			global_quad_port_a = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1031
		break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1032
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1033
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1034
	/* initialize the wol settings based on the eeprom settings */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1035
	adapter->wol = adapter->eeprom_wol;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1036
	device_set_wakeup_enable(&adapter->pdev->dev, adapter->wol);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1037
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1038
	/* print bus type/speed/width info */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1039
	DPRINTK(PROBE, INFO, "(PCI%s:%s:%s) ",
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1040
		((hw->bus_type == e1000_bus_type_pcix) ? "-X" : ""),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1041
		((hw->bus_speed == e1000_bus_speed_133) ? "133MHz" :
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1042
		 (hw->bus_speed == e1000_bus_speed_120) ? "120MHz" :
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1043
		 (hw->bus_speed == e1000_bus_speed_100) ? "100MHz" :
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1044
		 (hw->bus_speed == e1000_bus_speed_66) ? "66MHz" : "33MHz"),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1045
		((hw->bus_width == e1000_bus_width_64) ? "64-bit" : "32-bit"));
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1046
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1047
	printk("%pM\n", netdev->dev_addr);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1048
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1049
	/* reset the hardware with the new settings */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1050
	e1000_reset(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1051
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1052
	strcpy(netdev->name, "eth%d");
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1053
	err = register_netdev(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1054
	if (err)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1055
		goto err_register;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1056
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1057
	/* carrier off reporting is important to ethtool even BEFORE open */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1058
	netif_carrier_off(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1059
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1060
	DPRINTK(PROBE, INFO, "Intel(R) PRO/1000 Network Connection\n");
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1061
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1062
	cards_found++;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1063
	return 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1064
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1065
err_register:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1066
err_eeprom:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1067
	e1000_phy_hw_reset(hw);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1068
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1069
	if (hw->flash_address)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1070
		iounmap(hw->flash_address);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1071
	kfree(adapter->tx_ring);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1072
	kfree(adapter->rx_ring);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1073
err_sw_init:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1074
	iounmap(hw->hw_addr);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1075
err_ioremap:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1076
	free_netdev(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1077
err_alloc_etherdev:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1078
	pci_release_selected_regions(pdev, bars);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1079
err_pci_reg:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1080
err_dma:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1081
	pci_disable_device(pdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1082
	return err;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1083
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1084
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1085
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1086
 * e1000_remove - Device Removal Routine
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1087
 * @pdev: PCI device information struct
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1088
 *
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1089
 * e1000_remove is called by the PCI subsystem to alert the driver
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1090
 * that it should release a PCI device.  The could be caused by a
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1091
 * Hot-Plug event, or because the driver is going to be removed from
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1092
 * memory.
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1093
 **/
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1094
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1095
static void __devexit e1000_remove(struct pci_dev *pdev)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1096
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1097
	struct net_device *netdev = pci_get_drvdata(pdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1098
	struct e1000_adapter *adapter = netdev_priv(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1099
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1100
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1101
	set_bit(__E1000_DOWN, &adapter->flags);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1102
	del_timer_sync(&adapter->tx_fifo_stall_timer);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1103
	del_timer_sync(&adapter->watchdog_timer);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1104
	del_timer_sync(&adapter->phy_info_timer);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1105
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1106
	cancel_work_sync(&adapter->reset_task);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1107
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1108
	e1000_release_manageability(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1109
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1110
	unregister_netdev(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1111
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1112
	e1000_phy_hw_reset(hw);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1113
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1114
	kfree(adapter->tx_ring);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1115
	kfree(adapter->rx_ring);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1116
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1117
	iounmap(hw->hw_addr);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1118
	if (hw->flash_address)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1119
		iounmap(hw->flash_address);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1120
	pci_release_selected_regions(pdev, adapter->bars);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1121
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1122
	free_netdev(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1123
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1124
	pci_disable_device(pdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1125
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1126
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1127
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1128
 * e1000_sw_init - Initialize general software structures (struct e1000_adapter)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1129
 * @adapter: board private structure to initialize
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1130
 *
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1131
 * e1000_sw_init initializes the Adapter private data structure.
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1132
 * Fields are initialized based on PCI device information and
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1133
 * OS network device settings (MTU size).
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1134
 **/
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1135
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1136
static int __devinit e1000_sw_init(struct e1000_adapter *adapter)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1137
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1138
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1139
	struct net_device *netdev = adapter->netdev;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1140
	struct pci_dev *pdev = adapter->pdev;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1141
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1142
	/* PCI config space info */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1143
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1144
	hw->vendor_id = pdev->vendor;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1145
	hw->device_id = pdev->device;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1146
	hw->subsystem_vendor_id = pdev->subsystem_vendor;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1147
	hw->subsystem_id = pdev->subsystem_device;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1148
	hw->revision_id = pdev->revision;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1149
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1150
	pci_read_config_word(pdev, PCI_COMMAND, &hw->pci_cmd_word);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1151
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1152
	adapter->rx_buffer_len = MAXIMUM_ETHERNET_VLAN_SIZE;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1153
	hw->max_frame_size = netdev->mtu +
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1154
			     ENET_HEADER_SIZE + ETHERNET_FCS_SIZE;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1155
	hw->min_frame_size = MINIMUM_ETHERNET_FRAME_SIZE;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1156
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1157
	/* identify the MAC */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1158
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1159
	if (e1000_set_mac_type(hw)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1160
		DPRINTK(PROBE, ERR, "Unknown MAC Type\n");
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1161
		return -EIO;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1162
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1163
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1164
	switch (hw->mac_type) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1165
	default:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1166
		break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1167
	case e1000_82541:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1168
	case e1000_82547:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1169
	case e1000_82541_rev_2:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1170
	case e1000_82547_rev_2:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1171
		hw->phy_init_script = 1;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1172
		break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1173
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1174
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1175
	e1000_set_media_type(hw);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1176
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1177
	hw->wait_autoneg_complete = false;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1178
	hw->tbi_compatibility_en = true;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1179
	hw->adaptive_ifs = true;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1180
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1181
	/* Copper options */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1182
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1183
	if (hw->media_type == e1000_media_type_copper) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1184
		hw->mdix = AUTO_ALL_MODES;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1185
		hw->disable_polarity_correction = false;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1186
		hw->master_slave = E1000_MASTER_SLAVE;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1187
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1188
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1189
	adapter->num_tx_queues = 1;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1190
	adapter->num_rx_queues = 1;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1191
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1192
	if (e1000_alloc_queues(adapter)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1193
		DPRINTK(PROBE, ERR, "Unable to allocate memory for queues\n");
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1194
		return -ENOMEM;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1195
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1196
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1197
	/* Explicitly disable IRQ since the NIC can be in any state. */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1198
	e1000_irq_disable(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1199
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1200
	spin_lock_init(&adapter->stats_lock);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1201
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1202
	set_bit(__E1000_DOWN, &adapter->flags);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1203
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1204
	return 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1205
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1206
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1207
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1208
 * e1000_alloc_queues - Allocate memory for all rings
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1209
 * @adapter: board private structure to initialize
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1210
 *
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1211
 * We allocate one ring per queue at run-time since we don't know the
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1212
 * number of queues at compile-time.
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1213
 **/
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1214
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1215
static int __devinit e1000_alloc_queues(struct e1000_adapter *adapter)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1216
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1217
	adapter->tx_ring = kcalloc(adapter->num_tx_queues,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1218
	                           sizeof(struct e1000_tx_ring), GFP_KERNEL);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1219
	if (!adapter->tx_ring)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1220
		return -ENOMEM;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1221
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1222
	adapter->rx_ring = kcalloc(adapter->num_rx_queues,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1223
	                           sizeof(struct e1000_rx_ring), GFP_KERNEL);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1224
	if (!adapter->rx_ring) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1225
		kfree(adapter->tx_ring);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1226
		return -ENOMEM;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1227
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1228
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1229
	return E1000_SUCCESS;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1230
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1231
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1232
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1233
 * e1000_open - Called when a network interface is made active
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1234
 * @netdev: network interface device structure
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1235
 *
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1236
 * Returns 0 on success, negative value on failure
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1237
 *
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1238
 * The open entry point is called when a network interface is made
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1239
 * active by the system (IFF_UP).  At this point all resources needed
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1240
 * for transmit and receive operations are allocated, the interrupt
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1241
 * handler is registered with the OS, the watchdog timer is started,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1242
 * and the stack is notified that the interface is ready.
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1243
 **/
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1244
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1245
static int e1000_open(struct net_device *netdev)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1246
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1247
	struct e1000_adapter *adapter = netdev_priv(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1248
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1249
	int err;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1250
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1251
	/* disallow open during test */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1252
	if (test_bit(__E1000_TESTING, &adapter->flags))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1253
		return -EBUSY;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1254
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1255
	netif_carrier_off(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1256
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1257
	/* allocate transmit descriptors */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1258
	err = e1000_setup_all_tx_resources(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1259
	if (err)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1260
		goto err_setup_tx;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1261
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1262
	/* allocate receive descriptors */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1263
	err = e1000_setup_all_rx_resources(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1264
	if (err)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1265
		goto err_setup_rx;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1266
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1267
	e1000_power_up_phy(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1268
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1269
	adapter->mng_vlan_id = E1000_MNG_VLAN_NONE;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1270
	if ((hw->mng_cookie.status &
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1271
			  E1000_MNG_DHCP_COOKIE_STATUS_VLAN_SUPPORT)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1272
		e1000_update_mng_vlan(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1273
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1274
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1275
	/* before we allocate an interrupt, we must be ready to handle it.
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1276
	 * Setting DEBUG_SHIRQ in the kernel makes it fire an interrupt
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1277
	 * as soon as we call pci_request_irq, so we have to setup our
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1278
	 * clean_rx handler before we do so.  */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1279
	e1000_configure(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1280
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1281
	err = e1000_request_irq(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1282
	if (err)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1283
		goto err_req_irq;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1284
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1285
	/* From here on the code is the same as e1000_up() */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1286
	clear_bit(__E1000_DOWN, &adapter->flags);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1287
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1288
	napi_enable(&adapter->napi);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1289
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1290
	e1000_irq_enable(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1291
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1292
	netif_start_queue(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1293
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1294
	/* fire a link status change interrupt to start the watchdog */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1295
	ew32(ICS, E1000_ICS_LSC);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1296
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1297
	return E1000_SUCCESS;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1298
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1299
err_req_irq:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1300
	e1000_power_down_phy(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1301
	e1000_free_all_rx_resources(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1302
err_setup_rx:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1303
	e1000_free_all_tx_resources(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1304
err_setup_tx:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1305
	e1000_reset(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1306
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1307
	return err;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1308
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1309
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1310
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1311
 * e1000_close - Disables a network interface
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1312
 * @netdev: network interface device structure
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1313
 *
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1314
 * Returns 0, this is not allowed to fail
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1315
 *
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1316
 * The close entry point is called when an interface is de-activated
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1317
 * by the OS.  The hardware is still under the drivers control, but
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1318
 * needs to be disabled.  A global MAC reset is issued to stop the
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1319
 * hardware, and all transmit and receive resources are freed.
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1320
 **/
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1321
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1322
static int e1000_close(struct net_device *netdev)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1323
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1324
	struct e1000_adapter *adapter = netdev_priv(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1325
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1326
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1327
	WARN_ON(test_bit(__E1000_RESETTING, &adapter->flags));
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1328
	e1000_down(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1329
	e1000_power_down_phy(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1330
	e1000_free_irq(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1331
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1332
	e1000_free_all_tx_resources(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1333
	e1000_free_all_rx_resources(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1334
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1335
	/* kill manageability vlan ID if supported, but not if a vlan with
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1336
	 * the same ID is registered on the host OS (let 8021q kill it) */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1337
	if ((hw->mng_cookie.status &
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1338
			  E1000_MNG_DHCP_COOKIE_STATUS_VLAN_SUPPORT) &&
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1339
	     !(adapter->vlgrp &&
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1340
	       vlan_group_get_device(adapter->vlgrp, adapter->mng_vlan_id))) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1341
		e1000_vlan_rx_kill_vid(netdev, adapter->mng_vlan_id);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1342
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1343
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1344
	return 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1345
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1346
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1347
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1348
 * e1000_check_64k_bound - check that memory doesn't cross 64kB boundary
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1349
 * @adapter: address of board private structure
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1350
 * @start: address of beginning of memory
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1351
 * @len: length of memory
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1352
 **/
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1353
static bool e1000_check_64k_bound(struct e1000_adapter *adapter, void *start,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1354
				  unsigned long len)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1355
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1356
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1357
	unsigned long begin = (unsigned long)start;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1358
	unsigned long end = begin + len;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1359
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1360
	/* First rev 82545 and 82546 need to not allow any memory
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1361
	 * write location to cross 64k boundary due to errata 23 */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1362
	if (hw->mac_type == e1000_82545 ||
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1363
	    hw->mac_type == e1000_82546) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1364
		return ((begin ^ (end - 1)) >> 16) != 0 ? false : true;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1365
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1366
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1367
	return true;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1368
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1369
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1370
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1371
 * e1000_setup_tx_resources - allocate Tx resources (Descriptors)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1372
 * @adapter: board private structure
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1373
 * @txdr:    tx descriptor ring (for a specific queue) to setup
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1374
 *
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1375
 * Return 0 on success, negative on failure
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1376
 **/
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1377
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1378
static int e1000_setup_tx_resources(struct e1000_adapter *adapter,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1379
				    struct e1000_tx_ring *txdr)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1380
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1381
	struct pci_dev *pdev = adapter->pdev;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1382
	int size;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1383
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1384
	size = sizeof(struct e1000_buffer) * txdr->count;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1385
	txdr->buffer_info = vmalloc(size);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1386
	if (!txdr->buffer_info) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1387
		DPRINTK(PROBE, ERR,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1388
		"Unable to allocate memory for the transmit descriptor ring\n");
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1389
		return -ENOMEM;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1390
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1391
	memset(txdr->buffer_info, 0, size);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1392
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1393
	/* round up to nearest 4K */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1394
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1395
	txdr->size = txdr->count * sizeof(struct e1000_tx_desc);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1396
	txdr->size = ALIGN(txdr->size, 4096);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1397
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1398
	txdr->desc = pci_alloc_consistent(pdev, txdr->size, &txdr->dma);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1399
	if (!txdr->desc) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1400
setup_tx_desc_die:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1401
		vfree(txdr->buffer_info);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1402
		DPRINTK(PROBE, ERR,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1403
		"Unable to allocate memory for the transmit descriptor ring\n");
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1404
		return -ENOMEM;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1405
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1406
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1407
	/* Fix for errata 23, can't cross 64kB boundary */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1408
	if (!e1000_check_64k_bound(adapter, txdr->desc, txdr->size)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1409
		void *olddesc = txdr->desc;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1410
		dma_addr_t olddma = txdr->dma;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1411
		DPRINTK(TX_ERR, ERR, "txdr align check failed: %u bytes "
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1412
				     "at %p\n", txdr->size, txdr->desc);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1413
		/* Try again, without freeing the previous */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1414
		txdr->desc = pci_alloc_consistent(pdev, txdr->size, &txdr->dma);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1415
		/* Failed allocation, critical failure */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1416
		if (!txdr->desc) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1417
			pci_free_consistent(pdev, txdr->size, olddesc, olddma);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1418
			goto setup_tx_desc_die;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1419
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1420
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1421
		if (!e1000_check_64k_bound(adapter, txdr->desc, txdr->size)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1422
			/* give up */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1423
			pci_free_consistent(pdev, txdr->size, txdr->desc,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1424
					    txdr->dma);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1425
			pci_free_consistent(pdev, txdr->size, olddesc, olddma);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1426
			DPRINTK(PROBE, ERR,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1427
				"Unable to allocate aligned memory "
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1428
				"for the transmit descriptor ring\n");
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1429
			vfree(txdr->buffer_info);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1430
			return -ENOMEM;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1431
		} else {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1432
			/* Free old allocation, new allocation was successful */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1433
			pci_free_consistent(pdev, txdr->size, olddesc, olddma);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1434
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1435
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1436
	memset(txdr->desc, 0, txdr->size);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1437
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1438
	txdr->next_to_use = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1439
	txdr->next_to_clean = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1440
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1441
	return 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1442
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1443
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1444
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1445
 * e1000_setup_all_tx_resources - wrapper to allocate Tx resources
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1446
 * 				  (Descriptors) for all queues
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1447
 * @adapter: board private structure
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1448
 *
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1449
 * Return 0 on success, negative on failure
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1450
 **/
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1451
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1452
int e1000_setup_all_tx_resources(struct e1000_adapter *adapter)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1453
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1454
	int i, err = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1455
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1456
	for (i = 0; i < adapter->num_tx_queues; i++) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1457
		err = e1000_setup_tx_resources(adapter, &adapter->tx_ring[i]);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1458
		if (err) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1459
			DPRINTK(PROBE, ERR,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1460
				"Allocation for Tx Queue %u failed\n", i);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1461
			for (i-- ; i >= 0; i--)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1462
				e1000_free_tx_resources(adapter,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1463
							&adapter->tx_ring[i]);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1464
			break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1465
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1466
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1467
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1468
	return err;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1469
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1470
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1471
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1472
 * e1000_configure_tx - Configure 8254x Transmit Unit after Reset
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1473
 * @adapter: board private structure
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1474
 *
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1475
 * Configure the Tx unit of the MAC after a reset.
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1476
 **/
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1477
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1478
static void e1000_configure_tx(struct e1000_adapter *adapter)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1479
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1480
	u64 tdba;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1481
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1482
	u32 tdlen, tctl, tipg;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1483
	u32 ipgr1, ipgr2;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1484
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1485
	/* Setup the HW Tx Head and Tail descriptor pointers */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1486
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1487
	switch (adapter->num_tx_queues) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1488
	case 1:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1489
	default:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1490
		tdba = adapter->tx_ring[0].dma;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1491
		tdlen = adapter->tx_ring[0].count *
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1492
			sizeof(struct e1000_tx_desc);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1493
		ew32(TDLEN, tdlen);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1494
		ew32(TDBAH, (tdba >> 32));
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1495
		ew32(TDBAL, (tdba & 0x00000000ffffffffULL));
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1496
		ew32(TDT, 0);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1497
		ew32(TDH, 0);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1498
		adapter->tx_ring[0].tdh = ((hw->mac_type >= e1000_82543) ? E1000_TDH : E1000_82542_TDH);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1499
		adapter->tx_ring[0].tdt = ((hw->mac_type >= e1000_82543) ? E1000_TDT : E1000_82542_TDT);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1500
		break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1501
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1502
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1503
	/* Set the default values for the Tx Inter Packet Gap timer */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1504
	if ((hw->media_type == e1000_media_type_fiber ||
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1505
	     hw->media_type == e1000_media_type_internal_serdes))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1506
		tipg = DEFAULT_82543_TIPG_IPGT_FIBER;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1507
	else
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1508
		tipg = DEFAULT_82543_TIPG_IPGT_COPPER;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1509
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1510
	switch (hw->mac_type) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1511
	case e1000_82542_rev2_0:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1512
	case e1000_82542_rev2_1:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1513
		tipg = DEFAULT_82542_TIPG_IPGT;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1514
		ipgr1 = DEFAULT_82542_TIPG_IPGR1;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1515
		ipgr2 = DEFAULT_82542_TIPG_IPGR2;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1516
		break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1517
	default:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1518
		ipgr1 = DEFAULT_82543_TIPG_IPGR1;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1519
		ipgr2 = DEFAULT_82543_TIPG_IPGR2;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1520
		break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1521
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1522
	tipg |= ipgr1 << E1000_TIPG_IPGR1_SHIFT;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1523
	tipg |= ipgr2 << E1000_TIPG_IPGR2_SHIFT;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1524
	ew32(TIPG, tipg);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1525
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1526
	/* Set the Tx Interrupt Delay register */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1527
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1528
	ew32(TIDV, adapter->tx_int_delay);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1529
	if (hw->mac_type >= e1000_82540)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1530
		ew32(TADV, adapter->tx_abs_int_delay);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1531
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1532
	/* Program the Transmit Control Register */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1533
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1534
	tctl = er32(TCTL);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1535
	tctl &= ~E1000_TCTL_CT;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1536
	tctl |= E1000_TCTL_PSP | E1000_TCTL_RTLC |
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1537
		(E1000_COLLISION_THRESHOLD << E1000_CT_SHIFT);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1538
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1539
	e1000_config_collision_dist(hw);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1540
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1541
	/* Setup Transmit Descriptor Settings for eop descriptor */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1542
	adapter->txd_cmd = E1000_TXD_CMD_EOP | E1000_TXD_CMD_IFCS;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1543
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1544
	/* only set IDE if we are delaying interrupts using the timers */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1545
	if (adapter->tx_int_delay)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1546
		adapter->txd_cmd |= E1000_TXD_CMD_IDE;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1547
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1548
	if (hw->mac_type < e1000_82543)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1549
		adapter->txd_cmd |= E1000_TXD_CMD_RPS;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1550
	else
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1551
		adapter->txd_cmd |= E1000_TXD_CMD_RS;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1552
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1553
	/* Cache if we're 82544 running in PCI-X because we'll
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1554
	 * need this to apply a workaround later in the send path. */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1555
	if (hw->mac_type == e1000_82544 &&
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1556
	    hw->bus_type == e1000_bus_type_pcix)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1557
		adapter->pcix_82544 = 1;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1558
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1559
	ew32(TCTL, tctl);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1560
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1561
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1562
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1563
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1564
 * e1000_setup_rx_resources - allocate Rx resources (Descriptors)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1565
 * @adapter: board private structure
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1566
 * @rxdr:    rx descriptor ring (for a specific queue) to setup
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1567
 *
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1568
 * Returns 0 on success, negative on failure
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1569
 **/
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1570
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1571
static int e1000_setup_rx_resources(struct e1000_adapter *adapter,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1572
				    struct e1000_rx_ring *rxdr)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1573
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1574
	struct pci_dev *pdev = adapter->pdev;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1575
	int size, desc_len;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1576
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1577
	size = sizeof(struct e1000_buffer) * rxdr->count;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1578
	rxdr->buffer_info = vmalloc(size);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1579
	if (!rxdr->buffer_info) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1580
		DPRINTK(PROBE, ERR,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1581
		"Unable to allocate memory for the receive descriptor ring\n");
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1582
		return -ENOMEM;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1583
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1584
	memset(rxdr->buffer_info, 0, size);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1585
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1586
	desc_len = sizeof(struct e1000_rx_desc);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1587
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1588
	/* Round up to nearest 4K */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1589
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1590
	rxdr->size = rxdr->count * desc_len;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1591
	rxdr->size = ALIGN(rxdr->size, 4096);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1592
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1593
	rxdr->desc = pci_alloc_consistent(pdev, rxdr->size, &rxdr->dma);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1594
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1595
	if (!rxdr->desc) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1596
		DPRINTK(PROBE, ERR,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1597
		"Unable to allocate memory for the receive descriptor ring\n");
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1598
setup_rx_desc_die:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1599
		vfree(rxdr->buffer_info);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1600
		return -ENOMEM;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1601
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1602
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1603
	/* Fix for errata 23, can't cross 64kB boundary */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1604
	if (!e1000_check_64k_bound(adapter, rxdr->desc, rxdr->size)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1605
		void *olddesc = rxdr->desc;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1606
		dma_addr_t olddma = rxdr->dma;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1607
		DPRINTK(RX_ERR, ERR, "rxdr align check failed: %u bytes "
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1608
				     "at %p\n", rxdr->size, rxdr->desc);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1609
		/* Try again, without freeing the previous */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1610
		rxdr->desc = pci_alloc_consistent(pdev, rxdr->size, &rxdr->dma);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1611
		/* Failed allocation, critical failure */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1612
		if (!rxdr->desc) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1613
			pci_free_consistent(pdev, rxdr->size, olddesc, olddma);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1614
			DPRINTK(PROBE, ERR,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1615
				"Unable to allocate memory "
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1616
				"for the receive descriptor ring\n");
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1617
			goto setup_rx_desc_die;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1618
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1619
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1620
		if (!e1000_check_64k_bound(adapter, rxdr->desc, rxdr->size)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1621
			/* give up */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1622
			pci_free_consistent(pdev, rxdr->size, rxdr->desc,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1623
					    rxdr->dma);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1624
			pci_free_consistent(pdev, rxdr->size, olddesc, olddma);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1625
			DPRINTK(PROBE, ERR,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1626
				"Unable to allocate aligned memory "
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1627
				"for the receive descriptor ring\n");
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1628
			goto setup_rx_desc_die;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1629
		} else {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1630
			/* Free old allocation, new allocation was successful */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1631
			pci_free_consistent(pdev, rxdr->size, olddesc, olddma);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1632
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1633
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1634
	memset(rxdr->desc, 0, rxdr->size);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1635
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1636
	rxdr->next_to_clean = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1637
	rxdr->next_to_use = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1638
	rxdr->rx_skb_top = NULL;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1639
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1640
	return 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1641
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1642
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1643
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1644
 * e1000_setup_all_rx_resources - wrapper to allocate Rx resources
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1645
 * 				  (Descriptors) for all queues
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1646
 * @adapter: board private structure
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1647
 *
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1648
 * Return 0 on success, negative on failure
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1649
 **/
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1650
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1651
int e1000_setup_all_rx_resources(struct e1000_adapter *adapter)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1652
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1653
	int i, err = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1654
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1655
	for (i = 0; i < adapter->num_rx_queues; i++) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1656
		err = e1000_setup_rx_resources(adapter, &adapter->rx_ring[i]);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1657
		if (err) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1658
			DPRINTK(PROBE, ERR,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1659
				"Allocation for Rx Queue %u failed\n", i);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1660
			for (i-- ; i >= 0; i--)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1661
				e1000_free_rx_resources(adapter,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1662
							&adapter->rx_ring[i]);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1663
			break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1664
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1665
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1666
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1667
	return err;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1668
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1669
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1670
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1671
 * e1000_setup_rctl - configure the receive control registers
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1672
 * @adapter: Board private structure
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1673
 **/
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1674
static void e1000_setup_rctl(struct e1000_adapter *adapter)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1675
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1676
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1677
	u32 rctl;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1678
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1679
	rctl = er32(RCTL);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1680
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1681
	rctl &= ~(3 << E1000_RCTL_MO_SHIFT);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1682
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1683
	rctl |= E1000_RCTL_EN | E1000_RCTL_BAM |
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1684
		E1000_RCTL_LBM_NO | E1000_RCTL_RDMTS_HALF |
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1685
		(hw->mc_filter_type << E1000_RCTL_MO_SHIFT);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1686
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1687
	if (hw->tbi_compatibility_on == 1)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1688
		rctl |= E1000_RCTL_SBP;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1689
	else
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1690
		rctl &= ~E1000_RCTL_SBP;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1691
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1692
	if (adapter->netdev->mtu <= ETH_DATA_LEN)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1693
		rctl &= ~E1000_RCTL_LPE;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1694
	else
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1695
		rctl |= E1000_RCTL_LPE;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1696
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1697
	/* Setup buffer sizes */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1698
	rctl &= ~E1000_RCTL_SZ_4096;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1699
	rctl |= E1000_RCTL_BSEX;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1700
	switch (adapter->rx_buffer_len) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1701
		case E1000_RXBUFFER_2048:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1702
		default:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1703
			rctl |= E1000_RCTL_SZ_2048;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1704
			rctl &= ~E1000_RCTL_BSEX;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1705
			break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1706
		case E1000_RXBUFFER_4096:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1707
			rctl |= E1000_RCTL_SZ_4096;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1708
			break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1709
		case E1000_RXBUFFER_8192:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1710
			rctl |= E1000_RCTL_SZ_8192;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1711
			break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1712
		case E1000_RXBUFFER_16384:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1713
			rctl |= E1000_RCTL_SZ_16384;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1714
			break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1715
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1716
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1717
	ew32(RCTL, rctl);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1718
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1719
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1720
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1721
 * e1000_configure_rx - Configure 8254x Receive Unit after Reset
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1722
 * @adapter: board private structure
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1723
 *
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1724
 * Configure the Rx unit of the MAC after a reset.
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1725
 **/
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1726
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1727
static void e1000_configure_rx(struct e1000_adapter *adapter)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1728
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1729
	u64 rdba;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1730
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1731
	u32 rdlen, rctl, rxcsum;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1732
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1733
	if (adapter->netdev->mtu > ETH_DATA_LEN) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1734
		rdlen = adapter->rx_ring[0].count *
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1735
		        sizeof(struct e1000_rx_desc);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1736
		adapter->clean_rx = e1000_clean_jumbo_rx_irq;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1737
		adapter->alloc_rx_buf = e1000_alloc_jumbo_rx_buffers;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1738
	} else {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1739
		rdlen = adapter->rx_ring[0].count *
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1740
		        sizeof(struct e1000_rx_desc);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1741
		adapter->clean_rx = e1000_clean_rx_irq;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1742
		adapter->alloc_rx_buf = e1000_alloc_rx_buffers;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1743
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1744
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1745
	/* disable receives while setting up the descriptors */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1746
	rctl = er32(RCTL);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1747
	ew32(RCTL, rctl & ~E1000_RCTL_EN);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1748
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1749
	/* set the Receive Delay Timer Register */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1750
	ew32(RDTR, adapter->rx_int_delay);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1751
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1752
	if (hw->mac_type >= e1000_82540) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1753
		ew32(RADV, adapter->rx_abs_int_delay);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1754
		if (adapter->itr_setting != 0)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1755
			ew32(ITR, 1000000000 / (adapter->itr * 256));
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1756
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1757
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1758
	/* Setup the HW Rx Head and Tail Descriptor Pointers and
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1759
	 * the Base and Length of the Rx Descriptor Ring */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1760
	switch (adapter->num_rx_queues) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1761
	case 1:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1762
	default:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1763
		rdba = adapter->rx_ring[0].dma;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1764
		ew32(RDLEN, rdlen);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1765
		ew32(RDBAH, (rdba >> 32));
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1766
		ew32(RDBAL, (rdba & 0x00000000ffffffffULL));
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1767
		ew32(RDT, 0);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1768
		ew32(RDH, 0);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1769
		adapter->rx_ring[0].rdh = ((hw->mac_type >= e1000_82543) ? E1000_RDH : E1000_82542_RDH);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1770
		adapter->rx_ring[0].rdt = ((hw->mac_type >= e1000_82543) ? E1000_RDT : E1000_82542_RDT);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1771
		break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1772
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1773
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1774
	/* Enable 82543 Receive Checksum Offload for TCP and UDP */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1775
	if (hw->mac_type >= e1000_82543) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1776
		rxcsum = er32(RXCSUM);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1777
		if (adapter->rx_csum)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1778
			rxcsum |= E1000_RXCSUM_TUOFL;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1779
		else
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1780
			/* don't need to clear IPPCSE as it defaults to 0 */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1781
			rxcsum &= ~E1000_RXCSUM_TUOFL;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1782
		ew32(RXCSUM, rxcsum);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1783
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1784
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1785
	/* Enable Receives */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1786
	ew32(RCTL, rctl);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1787
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1788
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1789
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1790
 * e1000_free_tx_resources - Free Tx Resources per Queue
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1791
 * @adapter: board private structure
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1792
 * @tx_ring: Tx descriptor ring for a specific queue
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1793
 *
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1794
 * Free all transmit software resources
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1795
 **/
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1796
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1797
static void e1000_free_tx_resources(struct e1000_adapter *adapter,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1798
				    struct e1000_tx_ring *tx_ring)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1799
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1800
	struct pci_dev *pdev = adapter->pdev;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1801
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1802
	e1000_clean_tx_ring(adapter, tx_ring);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1803
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1804
	vfree(tx_ring->buffer_info);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1805
	tx_ring->buffer_info = NULL;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1806
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1807
	pci_free_consistent(pdev, tx_ring->size, tx_ring->desc, tx_ring->dma);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1808
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1809
	tx_ring->desc = NULL;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1810
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1811
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1812
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1813
 * e1000_free_all_tx_resources - Free Tx Resources for All Queues
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1814
 * @adapter: board private structure
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1815
 *
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1816
 * Free all transmit software resources
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1817
 **/
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1818
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1819
void e1000_free_all_tx_resources(struct e1000_adapter *adapter)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1820
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1821
	int i;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1822
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1823
	for (i = 0; i < adapter->num_tx_queues; i++)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1824
		e1000_free_tx_resources(adapter, &adapter->tx_ring[i]);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1825
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1826
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1827
static void e1000_unmap_and_free_tx_resource(struct e1000_adapter *adapter,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1828
					     struct e1000_buffer *buffer_info)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1829
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1830
	if (buffer_info->dma) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1831
		if (buffer_info->mapped_as_page)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1832
			pci_unmap_page(adapter->pdev, buffer_info->dma,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1833
				       buffer_info->length, PCI_DMA_TODEVICE);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1834
		else
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1835
			pci_unmap_single(adapter->pdev,	buffer_info->dma,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1836
					 buffer_info->length,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1837
					 PCI_DMA_TODEVICE);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1838
		buffer_info->dma = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1839
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1840
	if (buffer_info->skb) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1841
		dev_kfree_skb_any(buffer_info->skb);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1842
		buffer_info->skb = NULL;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1843
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1844
	buffer_info->time_stamp = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1845
	/* buffer_info must be completely set up in the transmit path */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1846
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1847
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1848
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1849
 * e1000_clean_tx_ring - Free Tx Buffers
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1850
 * @adapter: board private structure
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1851
 * @tx_ring: ring to be cleaned
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1852
 **/
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1853
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1854
static void e1000_clean_tx_ring(struct e1000_adapter *adapter,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1855
				struct e1000_tx_ring *tx_ring)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1856
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1857
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1858
	struct e1000_buffer *buffer_info;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1859
	unsigned long size;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1860
	unsigned int i;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1861
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1862
	/* Free all the Tx ring sk_buffs */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1863
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1864
	for (i = 0; i < tx_ring->count; i++) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1865
		buffer_info = &tx_ring->buffer_info[i];
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1866
		e1000_unmap_and_free_tx_resource(adapter, buffer_info);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1867
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1868
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1869
	size = sizeof(struct e1000_buffer) * tx_ring->count;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1870
	memset(tx_ring->buffer_info, 0, size);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1871
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1872
	/* Zero out the descriptor ring */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1873
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1874
	memset(tx_ring->desc, 0, tx_ring->size);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1875
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1876
	tx_ring->next_to_use = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1877
	tx_ring->next_to_clean = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1878
	tx_ring->last_tx_tso = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1879
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1880
	writel(0, hw->hw_addr + tx_ring->tdh);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1881
	writel(0, hw->hw_addr + tx_ring->tdt);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1882
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1883
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1884
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1885
 * e1000_clean_all_tx_rings - Free Tx Buffers for all queues
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1886
 * @adapter: board private structure
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1887
 **/
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1888
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1889
static void e1000_clean_all_tx_rings(struct e1000_adapter *adapter)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1890
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1891
	int i;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1892
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1893
	for (i = 0; i < adapter->num_tx_queues; i++)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1894
		e1000_clean_tx_ring(adapter, &adapter->tx_ring[i]);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1895
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1896
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1897
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1898
 * e1000_free_rx_resources - Free Rx Resources
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1899
 * @adapter: board private structure
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1900
 * @rx_ring: ring to clean the resources from
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1901
 *
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1902
 * Free all receive software resources
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1903
 **/
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1904
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1905
static void e1000_free_rx_resources(struct e1000_adapter *adapter,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1906
				    struct e1000_rx_ring *rx_ring)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1907
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1908
	struct pci_dev *pdev = adapter->pdev;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1909
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1910
	e1000_clean_rx_ring(adapter, rx_ring);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1911
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1912
	vfree(rx_ring->buffer_info);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1913
	rx_ring->buffer_info = NULL;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1914
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1915
	pci_free_consistent(pdev, rx_ring->size, rx_ring->desc, rx_ring->dma);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1916
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1917
	rx_ring->desc = NULL;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1918
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1919
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1920
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1921
 * e1000_free_all_rx_resources - Free Rx Resources for All Queues
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1922
 * @adapter: board private structure
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1923
 *
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1924
 * Free all receive software resources
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1925
 **/
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1926
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1927
void e1000_free_all_rx_resources(struct e1000_adapter *adapter)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1928
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1929
	int i;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1930
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1931
	for (i = 0; i < adapter->num_rx_queues; i++)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1932
		e1000_free_rx_resources(adapter, &adapter->rx_ring[i]);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1933
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1934
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1935
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1936
 * e1000_clean_rx_ring - Free Rx Buffers per Queue
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1937
 * @adapter: board private structure
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1938
 * @rx_ring: ring to free buffers from
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1939
 **/
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1940
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1941
static void e1000_clean_rx_ring(struct e1000_adapter *adapter,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1942
				struct e1000_rx_ring *rx_ring)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1943
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1944
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1945
	struct e1000_buffer *buffer_info;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1946
	struct pci_dev *pdev = adapter->pdev;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1947
	unsigned long size;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1948
	unsigned int i;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1949
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1950
	/* Free all the Rx ring sk_buffs */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1951
	for (i = 0; i < rx_ring->count; i++) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1952
		buffer_info = &rx_ring->buffer_info[i];
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1953
		if (buffer_info->dma &&
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1954
		    adapter->clean_rx == e1000_clean_rx_irq) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1955
			pci_unmap_single(pdev, buffer_info->dma,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1956
			                 buffer_info->length,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1957
			                 PCI_DMA_FROMDEVICE);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1958
		} else if (buffer_info->dma &&
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1959
		           adapter->clean_rx == e1000_clean_jumbo_rx_irq) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1960
			pci_unmap_page(pdev, buffer_info->dma,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1961
			               buffer_info->length,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1962
			               PCI_DMA_FROMDEVICE);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1963
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1964
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1965
		buffer_info->dma = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1966
		if (buffer_info->page) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1967
			put_page(buffer_info->page);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1968
			buffer_info->page = NULL;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1969
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1970
		if (buffer_info->skb) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1971
			dev_kfree_skb(buffer_info->skb);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1972
			buffer_info->skb = NULL;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1973
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1974
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1975
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1976
	/* there also may be some cached data from a chained receive */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1977
	if (rx_ring->rx_skb_top) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1978
		dev_kfree_skb(rx_ring->rx_skb_top);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1979
		rx_ring->rx_skb_top = NULL;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1980
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1981
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1982
	size = sizeof(struct e1000_buffer) * rx_ring->count;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1983
	memset(rx_ring->buffer_info, 0, size);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1984
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1985
	/* Zero out the descriptor ring */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1986
	memset(rx_ring->desc, 0, rx_ring->size);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1987
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1988
	rx_ring->next_to_clean = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1989
	rx_ring->next_to_use = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1990
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1991
	writel(0, hw->hw_addr + rx_ring->rdh);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1992
	writel(0, hw->hw_addr + rx_ring->rdt);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1993
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1994
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1995
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1996
 * e1000_clean_all_rx_rings - Free Rx Buffers for all queues
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1997
 * @adapter: board private structure
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1998
 **/
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1999
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2000
static void e1000_clean_all_rx_rings(struct e1000_adapter *adapter)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2001
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2002
	int i;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2003
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2004
	for (i = 0; i < adapter->num_rx_queues; i++)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2005
		e1000_clean_rx_ring(adapter, &adapter->rx_ring[i]);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2006
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2007
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2008
/* The 82542 2.0 (revision 2) needs to have the receive unit in reset
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2009
 * and memory write and invalidate disabled for certain operations
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2010
 */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2011
static void e1000_enter_82542_rst(struct e1000_adapter *adapter)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2012
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2013
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2014
	struct net_device *netdev = adapter->netdev;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2015
	u32 rctl;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2016
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2017
	e1000_pci_clear_mwi(hw);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2018
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2019
	rctl = er32(RCTL);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2020
	rctl |= E1000_RCTL_RST;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2021
	ew32(RCTL, rctl);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2022
	E1000_WRITE_FLUSH();
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2023
	mdelay(5);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2024
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2025
	if (netif_running(netdev))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2026
		e1000_clean_all_rx_rings(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2027
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2028
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2029
static void e1000_leave_82542_rst(struct e1000_adapter *adapter)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2030
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2031
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2032
	struct net_device *netdev = adapter->netdev;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2033
	u32 rctl;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2034
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2035
	rctl = er32(RCTL);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2036
	rctl &= ~E1000_RCTL_RST;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2037
	ew32(RCTL, rctl);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2038
	E1000_WRITE_FLUSH();
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2039
	mdelay(5);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2040
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2041
	if (hw->pci_cmd_word & PCI_COMMAND_INVALIDATE)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2042
		e1000_pci_set_mwi(hw);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2043
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2044
	if (netif_running(netdev)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2045
		/* No need to loop, because 82542 supports only 1 queue */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2046
		struct e1000_rx_ring *ring = &adapter->rx_ring[0];
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2047
		e1000_configure_rx(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2048
		adapter->alloc_rx_buf(adapter, ring, E1000_DESC_UNUSED(ring));
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2049
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2050
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2051
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2052
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2053
 * e1000_set_mac - Change the Ethernet Address of the NIC
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2054
 * @netdev: network interface device structure
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2055
 * @p: pointer to an address structure
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2056
 *
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2057
 * Returns 0 on success, negative on failure
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2058
 **/
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2059
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2060
static int e1000_set_mac(struct net_device *netdev, void *p)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2061
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2062
	struct e1000_adapter *adapter = netdev_priv(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2063
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2064
	struct sockaddr *addr = p;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2065
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2066
	if (!is_valid_ether_addr(addr->sa_data))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2067
		return -EADDRNOTAVAIL;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2068
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2069
	/* 82542 2.0 needs to be in reset to write receive address registers */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2070
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2071
	if (hw->mac_type == e1000_82542_rev2_0)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2072
		e1000_enter_82542_rst(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2073
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2074
	memcpy(netdev->dev_addr, addr->sa_data, netdev->addr_len);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2075
	memcpy(hw->mac_addr, addr->sa_data, netdev->addr_len);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2076
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2077
	e1000_rar_set(hw, hw->mac_addr, 0);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2078
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2079
	if (hw->mac_type == e1000_82542_rev2_0)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2080
		e1000_leave_82542_rst(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2081
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2082
	return 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2083
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2084
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2085
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2086
 * e1000_set_rx_mode - Secondary Unicast, Multicast and Promiscuous mode set
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2087
 * @netdev: network interface device structure
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2088
 *
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2089
 * The set_rx_mode entry point is called whenever the unicast or multicast
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2090
 * address lists or the network interface flags are updated. This routine is
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2091
 * responsible for configuring the hardware for proper unicast, multicast,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2092
 * promiscuous mode, and all-multi behavior.
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2093
 **/
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2094
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2095
static void e1000_set_rx_mode(struct net_device *netdev)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2096
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2097
	struct e1000_adapter *adapter = netdev_priv(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2098
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2099
	struct netdev_hw_addr *ha;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2100
	bool use_uc = false;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2101
	struct dev_addr_list *mc_ptr;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2102
	u32 rctl;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2103
	u32 hash_value;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2104
	int i, rar_entries = E1000_RAR_ENTRIES;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2105
	int mta_reg_count = E1000_NUM_MTA_REGISTERS;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2106
	u32 *mcarray = kcalloc(mta_reg_count, sizeof(u32), GFP_ATOMIC);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2107
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2108
	if (!mcarray) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2109
		DPRINTK(PROBE, ERR, "memory allocation failed\n");
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2110
		return;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2111
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2112
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2113
	/* Check for Promiscuous and All Multicast modes */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2114
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2115
	rctl = er32(RCTL);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2116
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2117
	if (netdev->flags & IFF_PROMISC) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2118
		rctl |= (E1000_RCTL_UPE | E1000_RCTL_MPE);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2119
		rctl &= ~E1000_RCTL_VFE;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2120
	} else {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2121
		if (netdev->flags & IFF_ALLMULTI)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2122
			rctl |= E1000_RCTL_MPE;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2123
		else
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2124
			rctl &= ~E1000_RCTL_MPE;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2125
		/* Enable VLAN filter if there is a VLAN */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2126
		if (adapter->vlgrp)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2127
			rctl |= E1000_RCTL_VFE;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2128
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2129
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2130
	if (netdev->uc.count > rar_entries - 1) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2131
		rctl |= E1000_RCTL_UPE;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2132
	} else if (!(netdev->flags & IFF_PROMISC)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2133
		rctl &= ~E1000_RCTL_UPE;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2134
		use_uc = true;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2135
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2136
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2137
	ew32(RCTL, rctl);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2138
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2139
	/* 82542 2.0 needs to be in reset to write receive address registers */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2140
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2141
	if (hw->mac_type == e1000_82542_rev2_0)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2142
		e1000_enter_82542_rst(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2143
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2144
	/* load the first 14 addresses into the exact filters 1-14. Unicast
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2145
	 * addresses take precedence to avoid disabling unicast filtering
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2146
	 * when possible.
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2147
	 *
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2148
	 * RAR 0 is used for the station MAC adddress
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2149
	 * if there are not 14 addresses, go ahead and clear the filters
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2150
	 */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2151
	i = 1;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2152
	if (use_uc)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2153
		list_for_each_entry(ha, &netdev->uc.list, list) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2154
			if (i == rar_entries)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2155
				break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2156
			e1000_rar_set(hw, ha->addr, i++);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2157
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2158
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2159
	WARN_ON(i == rar_entries);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2160
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2161
	mc_ptr = netdev->mc_list;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2162
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2163
	for (; i < rar_entries; i++) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2164
		if (mc_ptr) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2165
			e1000_rar_set(hw, mc_ptr->da_addr, i);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2166
			mc_ptr = mc_ptr->next;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2167
		} else {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2168
			E1000_WRITE_REG_ARRAY(hw, RA, i << 1, 0);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2169
			E1000_WRITE_FLUSH();
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2170
			E1000_WRITE_REG_ARRAY(hw, RA, (i << 1) + 1, 0);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2171
			E1000_WRITE_FLUSH();
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2172
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2173
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2174
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2175
	/* load any remaining addresses into the hash table */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2176
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2177
	for (; mc_ptr; mc_ptr = mc_ptr->next) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2178
		u32 hash_reg, hash_bit, mta;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2179
		hash_value = e1000_hash_mc_addr(hw, mc_ptr->da_addr);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2180
		hash_reg = (hash_value >> 5) & 0x7F;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2181
		hash_bit = hash_value & 0x1F;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2182
		mta = (1 << hash_bit);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2183
		mcarray[hash_reg] |= mta;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2184
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2185
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2186
	/* write the hash table completely, write from bottom to avoid
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2187
	 * both stupid write combining chipsets, and flushing each write */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2188
	for (i = mta_reg_count - 1; i >= 0 ; i--) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2189
		/*
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2190
		 * If we are on an 82544 has an errata where writing odd
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2191
		 * offsets overwrites the previous even offset, but writing
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2192
		 * backwards over the range solves the issue by always
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2193
		 * writing the odd offset first
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2194
		 */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2195
		E1000_WRITE_REG_ARRAY(hw, MTA, i, mcarray[i]);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2196
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2197
	E1000_WRITE_FLUSH();
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2198
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2199
	if (hw->mac_type == e1000_82542_rev2_0)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2200
		e1000_leave_82542_rst(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2201
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2202
	kfree(mcarray);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2203
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2204
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2205
/* Need to wait a few seconds after link up to get diagnostic information from
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2206
 * the phy */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2207
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2208
static void e1000_update_phy_info(unsigned long data)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2209
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2210
	struct e1000_adapter *adapter = (struct e1000_adapter *)data;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2211
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2212
	e1000_phy_get_info(hw, &adapter->phy_info);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2213
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2214
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2215
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2216
 * e1000_82547_tx_fifo_stall - Timer Call-back
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2217
 * @data: pointer to adapter cast into an unsigned long
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2218
 **/
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2219
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2220
static void e1000_82547_tx_fifo_stall(unsigned long data)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2221
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2222
	struct e1000_adapter *adapter = (struct e1000_adapter *)data;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2223
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2224
	struct net_device *netdev = adapter->netdev;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2225
	u32 tctl;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2226
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2227
	if (atomic_read(&adapter->tx_fifo_stall)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2228
		if ((er32(TDT) == er32(TDH)) &&
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2229
		   (er32(TDFT) == er32(TDFH)) &&
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2230
		   (er32(TDFTS) == er32(TDFHS))) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2231
			tctl = er32(TCTL);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2232
			ew32(TCTL, tctl & ~E1000_TCTL_EN);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2233
			ew32(TDFT, adapter->tx_head_addr);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2234
			ew32(TDFH, adapter->tx_head_addr);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2235
			ew32(TDFTS, adapter->tx_head_addr);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2236
			ew32(TDFHS, adapter->tx_head_addr);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2237
			ew32(TCTL, tctl);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2238
			E1000_WRITE_FLUSH();
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2239
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2240
			adapter->tx_fifo_head = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2241
			atomic_set(&adapter->tx_fifo_stall, 0);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2242
			netif_wake_queue(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2243
		} else if (!test_bit(__E1000_DOWN, &adapter->flags)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2244
			mod_timer(&adapter->tx_fifo_stall_timer, jiffies + 1);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2245
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2246
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2247
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2248
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2249
static bool e1000_has_link(struct e1000_adapter *adapter)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2250
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2251
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2252
	bool link_active = false;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2253
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2254
	/* get_link_status is set on LSC (link status) interrupt or
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2255
	 * rx sequence error interrupt.  get_link_status will stay
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2256
	 * false until the e1000_check_for_link establishes link
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2257
	 * for copper adapters ONLY
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2258
	 */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2259
	switch (hw->media_type) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2260
	case e1000_media_type_copper:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2261
		if (hw->get_link_status) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2262
			e1000_check_for_link(hw);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2263
			link_active = !hw->get_link_status;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2264
		} else {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2265
			link_active = true;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2266
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2267
		break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2268
	case e1000_media_type_fiber:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2269
		e1000_check_for_link(hw);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2270
		link_active = !!(er32(STATUS) & E1000_STATUS_LU);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2271
		break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2272
	case e1000_media_type_internal_serdes:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2273
		e1000_check_for_link(hw);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2274
		link_active = hw->serdes_has_link;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2275
		break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2276
	default:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2277
		break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2278
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2279
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2280
	return link_active;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2281
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2282
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2283
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2284
 * e1000_watchdog - Timer Call-back
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2285
 * @data: pointer to adapter cast into an unsigned long
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2286
 **/
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2287
static void e1000_watchdog(unsigned long data)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2288
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2289
	struct e1000_adapter *adapter = (struct e1000_adapter *)data;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2290
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2291
	struct net_device *netdev = adapter->netdev;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2292
	struct e1000_tx_ring *txdr = adapter->tx_ring;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2293
	u32 link, tctl;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2294
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2295
	link = e1000_has_link(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2296
	if ((netif_carrier_ok(netdev)) && link)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2297
		goto link_up;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2298
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2299
	if (link) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2300
		if (!netif_carrier_ok(netdev)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2301
			u32 ctrl;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2302
			bool txb2b = true;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2303
			/* update snapshot of PHY registers on LSC */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2304
			e1000_get_speed_and_duplex(hw,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2305
			                           &adapter->link_speed,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2306
			                           &adapter->link_duplex);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2307
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2308
			ctrl = er32(CTRL);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2309
			printk(KERN_INFO "e1000: %s NIC Link is Up %d Mbps %s, "
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2310
			       "Flow Control: %s\n",
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2311
			       netdev->name,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2312
			       adapter->link_speed,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2313
			       adapter->link_duplex == FULL_DUPLEX ?
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2314
			        "Full Duplex" : "Half Duplex",
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2315
			        ((ctrl & E1000_CTRL_TFCE) && (ctrl &
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2316
			        E1000_CTRL_RFCE)) ? "RX/TX" : ((ctrl &
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2317
			        E1000_CTRL_RFCE) ? "RX" : ((ctrl &
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2318
			        E1000_CTRL_TFCE) ? "TX" : "None" )));
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2319
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2320
			/* tweak tx_queue_len according to speed/duplex
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2321
			 * and adjust the timeout factor */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2322
			netdev->tx_queue_len = adapter->tx_queue_len;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2323
			adapter->tx_timeout_factor = 1;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2324
			switch (adapter->link_speed) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2325
			case SPEED_10:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2326
				txb2b = false;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2327
				netdev->tx_queue_len = 10;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2328
				adapter->tx_timeout_factor = 16;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2329
				break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2330
			case SPEED_100:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2331
				txb2b = false;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2332
				netdev->tx_queue_len = 100;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2333
				/* maybe add some timeout factor ? */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2334
				break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2335
			}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2336
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2337
			/* enable transmits in the hardware */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2338
			tctl = er32(TCTL);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2339
			tctl |= E1000_TCTL_EN;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2340
			ew32(TCTL, tctl);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2341
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2342
			netif_carrier_on(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2343
			if (!test_bit(__E1000_DOWN, &adapter->flags))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2344
				mod_timer(&adapter->phy_info_timer,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2345
				          round_jiffies(jiffies + 2 * HZ));
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2346
			adapter->smartspeed = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2347
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2348
	} else {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2349
		if (netif_carrier_ok(netdev)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2350
			adapter->link_speed = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2351
			adapter->link_duplex = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2352
			printk(KERN_INFO "e1000: %s NIC Link is Down\n",
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2353
			       netdev->name);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2354
			netif_carrier_off(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2355
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2356
			if (!test_bit(__E1000_DOWN, &adapter->flags))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2357
				mod_timer(&adapter->phy_info_timer,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2358
				          round_jiffies(jiffies + 2 * HZ));
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2359
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2360
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2361
		e1000_smartspeed(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2362
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2363
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2364
link_up:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2365
	e1000_update_stats(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2366
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2367
	hw->tx_packet_delta = adapter->stats.tpt - adapter->tpt_old;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2368
	adapter->tpt_old = adapter->stats.tpt;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2369
	hw->collision_delta = adapter->stats.colc - adapter->colc_old;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2370
	adapter->colc_old = adapter->stats.colc;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2371
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2372
	adapter->gorcl = adapter->stats.gorcl - adapter->gorcl_old;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2373
	adapter->gorcl_old = adapter->stats.gorcl;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2374
	adapter->gotcl = adapter->stats.gotcl - adapter->gotcl_old;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2375
	adapter->gotcl_old = adapter->stats.gotcl;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2376
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2377
	e1000_update_adaptive(hw);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2378
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2379
	if (!netif_carrier_ok(netdev)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2380
		if (E1000_DESC_UNUSED(txdr) + 1 < txdr->count) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2381
			/* We've lost link, so the controller stops DMA,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2382
			 * but we've got queued Tx work that's never going
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2383
			 * to get done, so reset controller to flush Tx.
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2384
			 * (Do the reset outside of interrupt context). */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2385
			adapter->tx_timeout_count++;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2386
			schedule_work(&adapter->reset_task);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2387
			/* return immediately since reset is imminent */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2388
			return;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2389
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2390
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2391
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2392
	/* Cause software interrupt to ensure rx ring is cleaned */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2393
	ew32(ICS, E1000_ICS_RXDMT0);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2394
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2395
	/* Force detection of hung controller every watchdog period */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2396
	adapter->detect_tx_hung = true;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2397
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2398
	/* Reset the timer */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2399
	if (!test_bit(__E1000_DOWN, &adapter->flags))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2400
		mod_timer(&adapter->watchdog_timer,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2401
		          round_jiffies(jiffies + 2 * HZ));
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2402
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2403
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2404
enum latency_range {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2405
	lowest_latency = 0,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2406
	low_latency = 1,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2407
	bulk_latency = 2,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2408
	latency_invalid = 255
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2409
};
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2410
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2411
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2412
 * e1000_update_itr - update the dynamic ITR value based on statistics
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2413
 * @adapter: pointer to adapter
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2414
 * @itr_setting: current adapter->itr
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2415
 * @packets: the number of packets during this measurement interval
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2416
 * @bytes: the number of bytes during this measurement interval
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2417
 *
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2418
 *      Stores a new ITR value based on packets and byte
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2419
 *      counts during the last interrupt.  The advantage of per interrupt
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2420
 *      computation is faster updates and more accurate ITR for the current
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2421
 *      traffic pattern.  Constants in this function were computed
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2422
 *      based on theoretical maximum wire speed and thresholds were set based
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2423
 *      on testing data as well as attempting to minimize response time
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2424
 *      while increasing bulk throughput.
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2425
 *      this functionality is controlled by the InterruptThrottleRate module
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2426
 *      parameter (see e1000_param.c)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2427
 **/
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2428
static unsigned int e1000_update_itr(struct e1000_adapter *adapter,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2429
				     u16 itr_setting, int packets, int bytes)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2430
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2431
	unsigned int retval = itr_setting;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2432
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2433
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2434
	if (unlikely(hw->mac_type < e1000_82540))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2435
		goto update_itr_done;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2436
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2437
	if (packets == 0)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2438
		goto update_itr_done;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2439
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2440
	switch (itr_setting) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2441
	case lowest_latency:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2442
		/* jumbo frames get bulk treatment*/
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2443
		if (bytes/packets > 8000)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2444
			retval = bulk_latency;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2445
		else if ((packets < 5) && (bytes > 512))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2446
			retval = low_latency;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2447
		break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2448
	case low_latency:  /* 50 usec aka 20000 ints/s */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2449
		if (bytes > 10000) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2450
			/* jumbo frames need bulk latency setting */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2451
			if (bytes/packets > 8000)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2452
				retval = bulk_latency;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2453
			else if ((packets < 10) || ((bytes/packets) > 1200))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2454
				retval = bulk_latency;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2455
			else if ((packets > 35))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2456
				retval = lowest_latency;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2457
		} else if (bytes/packets > 2000)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2458
			retval = bulk_latency;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2459
		else if (packets <= 2 && bytes < 512)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2460
			retval = lowest_latency;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2461
		break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2462
	case bulk_latency: /* 250 usec aka 4000 ints/s */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2463
		if (bytes > 25000) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2464
			if (packets > 35)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2465
				retval = low_latency;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2466
		} else if (bytes < 6000) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2467
			retval = low_latency;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2468
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2469
		break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2470
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2471
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2472
update_itr_done:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2473
	return retval;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2474
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2475
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2476
static void e1000_set_itr(struct e1000_adapter *adapter)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2477
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2478
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2479
	u16 current_itr;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2480
	u32 new_itr = adapter->itr;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2481
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2482
	if (unlikely(hw->mac_type < e1000_82540))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2483
		return;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2484
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2485
	/* for non-gigabit speeds, just fix the interrupt rate at 4000 */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2486
	if (unlikely(adapter->link_speed != SPEED_1000)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2487
		current_itr = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2488
		new_itr = 4000;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2489
		goto set_itr_now;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2490
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2491
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2492
	adapter->tx_itr = e1000_update_itr(adapter,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2493
	                            adapter->tx_itr,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2494
	                            adapter->total_tx_packets,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2495
	                            adapter->total_tx_bytes);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2496
	/* conservative mode (itr 3) eliminates the lowest_latency setting */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2497
	if (adapter->itr_setting == 3 && adapter->tx_itr == lowest_latency)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2498
		adapter->tx_itr = low_latency;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2499
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2500
	adapter->rx_itr = e1000_update_itr(adapter,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2501
	                            adapter->rx_itr,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2502
	                            adapter->total_rx_packets,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2503
	                            adapter->total_rx_bytes);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2504
	/* conservative mode (itr 3) eliminates the lowest_latency setting */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2505
	if (adapter->itr_setting == 3 && adapter->rx_itr == lowest_latency)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2506
		adapter->rx_itr = low_latency;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2507
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2508
	current_itr = max(adapter->rx_itr, adapter->tx_itr);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2509
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2510
	switch (current_itr) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2511
	/* counts and packets in update_itr are dependent on these numbers */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2512
	case lowest_latency:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2513
		new_itr = 70000;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2514
		break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2515
	case low_latency:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2516
		new_itr = 20000; /* aka hwitr = ~200 */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2517
		break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2518
	case bulk_latency:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2519
		new_itr = 4000;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2520
		break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2521
	default:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2522
		break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2523
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2524
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2525
set_itr_now:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2526
	if (new_itr != adapter->itr) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2527
		/* this attempts to bias the interrupt rate towards Bulk
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2528
		 * by adding intermediate steps when interrupt rate is
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2529
		 * increasing */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2530
		new_itr = new_itr > adapter->itr ?
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2531
		             min(adapter->itr + (new_itr >> 2), new_itr) :
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2532
		             new_itr;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2533
		adapter->itr = new_itr;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2534
		ew32(ITR, 1000000000 / (new_itr * 256));
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2535
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2536
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2537
	return;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2538
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2539
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2540
#define E1000_TX_FLAGS_CSUM		0x00000001
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2541
#define E1000_TX_FLAGS_VLAN		0x00000002
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2542
#define E1000_TX_FLAGS_TSO		0x00000004
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2543
#define E1000_TX_FLAGS_IPV4		0x00000008
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2544
#define E1000_TX_FLAGS_VLAN_MASK	0xffff0000
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2545
#define E1000_TX_FLAGS_VLAN_SHIFT	16
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2546
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2547
static int e1000_tso(struct e1000_adapter *adapter,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2548
		     struct e1000_tx_ring *tx_ring, struct sk_buff *skb)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2549
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2550
	struct e1000_context_desc *context_desc;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2551
	struct e1000_buffer *buffer_info;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2552
	unsigned int i;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2553
	u32 cmd_length = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2554
	u16 ipcse = 0, tucse, mss;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2555
	u8 ipcss, ipcso, tucss, tucso, hdr_len;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2556
	int err;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2557
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2558
	if (skb_is_gso(skb)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2559
		if (skb_header_cloned(skb)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2560
			err = pskb_expand_head(skb, 0, 0, GFP_ATOMIC);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2561
			if (err)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2562
				return err;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2563
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2564
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2565
		hdr_len = skb_transport_offset(skb) + tcp_hdrlen(skb);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2566
		mss = skb_shinfo(skb)->gso_size;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2567
		if (skb->protocol == htons(ETH_P_IP)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2568
			struct iphdr *iph = ip_hdr(skb);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2569
			iph->tot_len = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2570
			iph->check = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2571
			tcp_hdr(skb)->check = ~csum_tcpudp_magic(iph->saddr,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2572
								 iph->daddr, 0,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2573
								 IPPROTO_TCP,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2574
								 0);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2575
			cmd_length = E1000_TXD_CMD_IP;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2576
			ipcse = skb_transport_offset(skb) - 1;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2577
		} else if (skb->protocol == htons(ETH_P_IPV6)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2578
			ipv6_hdr(skb)->payload_len = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2579
			tcp_hdr(skb)->check =
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2580
				~csum_ipv6_magic(&ipv6_hdr(skb)->saddr,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2581
						 &ipv6_hdr(skb)->daddr,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2582
						 0, IPPROTO_TCP, 0);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2583
			ipcse = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2584
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2585
		ipcss = skb_network_offset(skb);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2586
		ipcso = (void *)&(ip_hdr(skb)->check) - (void *)skb->data;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2587
		tucss = skb_transport_offset(skb);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2588
		tucso = (void *)&(tcp_hdr(skb)->check) - (void *)skb->data;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2589
		tucse = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2590
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2591
		cmd_length |= (E1000_TXD_CMD_DEXT | E1000_TXD_CMD_TSE |
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2592
			       E1000_TXD_CMD_TCP | (skb->len - (hdr_len)));
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2593
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2594
		i = tx_ring->next_to_use;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2595
		context_desc = E1000_CONTEXT_DESC(*tx_ring, i);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2596
		buffer_info = &tx_ring->buffer_info[i];
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2597
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2598
		context_desc->lower_setup.ip_fields.ipcss  = ipcss;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2599
		context_desc->lower_setup.ip_fields.ipcso  = ipcso;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2600
		context_desc->lower_setup.ip_fields.ipcse  = cpu_to_le16(ipcse);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2601
		context_desc->upper_setup.tcp_fields.tucss = tucss;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2602
		context_desc->upper_setup.tcp_fields.tucso = tucso;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2603
		context_desc->upper_setup.tcp_fields.tucse = cpu_to_le16(tucse);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2604
		context_desc->tcp_seg_setup.fields.mss     = cpu_to_le16(mss);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2605
		context_desc->tcp_seg_setup.fields.hdr_len = hdr_len;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2606
		context_desc->cmd_and_length = cpu_to_le32(cmd_length);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2607
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2608
		buffer_info->time_stamp = jiffies;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2609
		buffer_info->next_to_watch = i;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2610
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2611
		if (++i == tx_ring->count) i = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2612
		tx_ring->next_to_use = i;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2613
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2614
		return true;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2615
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2616
	return false;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2617
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2618
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2619
static bool e1000_tx_csum(struct e1000_adapter *adapter,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2620
			  struct e1000_tx_ring *tx_ring, struct sk_buff *skb)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2621
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2622
	struct e1000_context_desc *context_desc;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2623
	struct e1000_buffer *buffer_info;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2624
	unsigned int i;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2625
	u8 css;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2626
	u32 cmd_len = E1000_TXD_CMD_DEXT;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2627
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2628
	if (skb->ip_summed != CHECKSUM_PARTIAL)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2629
		return false;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2630
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2631
	switch (skb->protocol) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2632
	case cpu_to_be16(ETH_P_IP):
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2633
		if (ip_hdr(skb)->protocol == IPPROTO_TCP)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2634
			cmd_len |= E1000_TXD_CMD_TCP;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2635
		break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2636
	case cpu_to_be16(ETH_P_IPV6):
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2637
		/* XXX not handling all IPV6 headers */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2638
		if (ipv6_hdr(skb)->nexthdr == IPPROTO_TCP)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2639
			cmd_len |= E1000_TXD_CMD_TCP;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2640
		break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2641
	default:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2642
		if (unlikely(net_ratelimit()))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2643
			DPRINTK(DRV, WARNING,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2644
			        "checksum_partial proto=%x!\n", skb->protocol);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2645
		break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2646
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2647
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2648
	css = skb_transport_offset(skb);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2649
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2650
	i = tx_ring->next_to_use;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2651
	buffer_info = &tx_ring->buffer_info[i];
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2652
	context_desc = E1000_CONTEXT_DESC(*tx_ring, i);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2653
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2654
	context_desc->lower_setup.ip_config = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2655
	context_desc->upper_setup.tcp_fields.tucss = css;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2656
	context_desc->upper_setup.tcp_fields.tucso =
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2657
		css + skb->csum_offset;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2658
	context_desc->upper_setup.tcp_fields.tucse = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2659
	context_desc->tcp_seg_setup.data = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2660
	context_desc->cmd_and_length = cpu_to_le32(cmd_len);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2661
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2662
	buffer_info->time_stamp = jiffies;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2663
	buffer_info->next_to_watch = i;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2664
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2665
	if (unlikely(++i == tx_ring->count)) i = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2666
	tx_ring->next_to_use = i;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2667
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2668
	return true;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2669
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2670
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2671
#define E1000_MAX_TXD_PWR	12
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2672
#define E1000_MAX_DATA_PER_TXD	(1<<E1000_MAX_TXD_PWR)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2673
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2674
static int e1000_tx_map(struct e1000_adapter *adapter,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2675
			struct e1000_tx_ring *tx_ring,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2676
			struct sk_buff *skb, unsigned int first,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2677
			unsigned int max_per_txd, unsigned int nr_frags,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2678
			unsigned int mss)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2679
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2680
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2681
	struct pci_dev *pdev = adapter->pdev;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2682
	struct e1000_buffer *buffer_info;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2683
	unsigned int len = skb_headlen(skb);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2684
	unsigned int offset = 0, size, count = 0, i;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2685
	unsigned int f;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2686
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2687
	i = tx_ring->next_to_use;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2688
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2689
	while (len) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2690
		buffer_info = &tx_ring->buffer_info[i];
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2691
		size = min(len, max_per_txd);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2692
		/* Workaround for Controller erratum --
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2693
		 * descriptor for non-tso packet in a linear SKB that follows a
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2694
		 * tso gets written back prematurely before the data is fully
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2695
		 * DMA'd to the controller */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2696
		if (!skb->data_len && tx_ring->last_tx_tso &&
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2697
		    !skb_is_gso(skb)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2698
			tx_ring->last_tx_tso = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2699
			size -= 4;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2700
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2701
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2702
		/* Workaround for premature desc write-backs
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2703
		 * in TSO mode.  Append 4-byte sentinel desc */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2704
		if (unlikely(mss && !nr_frags && size == len && size > 8))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2705
			size -= 4;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2706
		/* work-around for errata 10 and it applies
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2707
		 * to all controllers in PCI-X mode
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2708
		 * The fix is to make sure that the first descriptor of a
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2709
		 * packet is smaller than 2048 - 16 - 16 (or 2016) bytes
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2710
		 */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2711
		if (unlikely((hw->bus_type == e1000_bus_type_pcix) &&
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2712
		                (size > 2015) && count == 0))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2713
		        size = 2015;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2714
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2715
		/* Workaround for potential 82544 hang in PCI-X.  Avoid
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2716
		 * terminating buffers within evenly-aligned dwords. */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2717
		if (unlikely(adapter->pcix_82544 &&
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2718
		   !((unsigned long)(skb->data + offset + size - 1) & 4) &&
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2719
		   size > 4))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2720
			size -= 4;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2721
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2722
		buffer_info->length = size;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2723
		/* set time_stamp *before* dma to help avoid a possible race */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2724
		buffer_info->time_stamp = jiffies;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2725
		buffer_info->mapped_as_page = false;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2726
		buffer_info->dma = pci_map_single(pdev,	skb->data + offset,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2727
						  size,	PCI_DMA_TODEVICE);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2728
		if (pci_dma_mapping_error(pdev, buffer_info->dma))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2729
			goto dma_error;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2730
		buffer_info->next_to_watch = i;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2731
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2732
		len -= size;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2733
		offset += size;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2734
		count++;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2735
		if (len) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2736
			i++;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2737
			if (unlikely(i == tx_ring->count))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2738
				i = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2739
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2740
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2741
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2742
	for (f = 0; f < nr_frags; f++) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2743
		struct skb_frag_struct *frag;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2744
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2745
		frag = &skb_shinfo(skb)->frags[f];
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2746
		len = frag->size;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2747
		offset = frag->page_offset;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2748
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2749
		while (len) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2750
			i++;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2751
			if (unlikely(i == tx_ring->count))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2752
				i = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2753
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2754
			buffer_info = &tx_ring->buffer_info[i];
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2755
			size = min(len, max_per_txd);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2756
			/* Workaround for premature desc write-backs
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2757
			 * in TSO mode.  Append 4-byte sentinel desc */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2758
			if (unlikely(mss && f == (nr_frags-1) && size == len && size > 8))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2759
				size -= 4;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2760
			/* Workaround for potential 82544 hang in PCI-X.
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2761
			 * Avoid terminating buffers within evenly-aligned
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2762
			 * dwords. */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2763
			if (unlikely(adapter->pcix_82544 &&
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2764
			    !((unsigned long)(page_to_phys(frag->page) + offset
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2765
			                      + size - 1) & 4) &&
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2766
			    size > 4))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2767
				size -= 4;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2768
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2769
			buffer_info->length = size;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2770
			buffer_info->time_stamp = jiffies;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2771
			buffer_info->mapped_as_page = true;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2772
			buffer_info->dma = pci_map_page(pdev, frag->page,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2773
							offset,	size,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2774
							PCI_DMA_TODEVICE);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2775
			if (pci_dma_mapping_error(pdev, buffer_info->dma))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2776
				goto dma_error;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2777
			buffer_info->next_to_watch = i;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2778
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2779
			len -= size;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2780
			offset += size;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2781
			count++;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2782
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2783
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2784
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2785
	tx_ring->buffer_info[i].skb = skb;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2786
	tx_ring->buffer_info[first].next_to_watch = i;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2787
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2788
	return count;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2789
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2790
dma_error:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2791
	dev_err(&pdev->dev, "TX DMA map failed\n");
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2792
	buffer_info->dma = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2793
	if (count)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2794
		count--;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2795
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2796
	while (count--) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2797
		if (i==0)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2798
			i += tx_ring->count;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2799
		i--;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2800
		buffer_info = &tx_ring->buffer_info[i];
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2801
		e1000_unmap_and_free_tx_resource(adapter, buffer_info);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2802
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2803
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2804
	return 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2805
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2806
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2807
static void e1000_tx_queue(struct e1000_adapter *adapter,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2808
			   struct e1000_tx_ring *tx_ring, int tx_flags,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2809
			   int count)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2810
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2811
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2812
	struct e1000_tx_desc *tx_desc = NULL;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2813
	struct e1000_buffer *buffer_info;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2814
	u32 txd_upper = 0, txd_lower = E1000_TXD_CMD_IFCS;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2815
	unsigned int i;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2816
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2817
	if (likely(tx_flags & E1000_TX_FLAGS_TSO)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2818
		txd_lower |= E1000_TXD_CMD_DEXT | E1000_TXD_DTYP_D |
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2819
		             E1000_TXD_CMD_TSE;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2820
		txd_upper |= E1000_TXD_POPTS_TXSM << 8;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2821
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2822
		if (likely(tx_flags & E1000_TX_FLAGS_IPV4))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2823
			txd_upper |= E1000_TXD_POPTS_IXSM << 8;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2824
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2825
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2826
	if (likely(tx_flags & E1000_TX_FLAGS_CSUM)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2827
		txd_lower |= E1000_TXD_CMD_DEXT | E1000_TXD_DTYP_D;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2828
		txd_upper |= E1000_TXD_POPTS_TXSM << 8;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2829
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2830
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2831
	if (unlikely(tx_flags & E1000_TX_FLAGS_VLAN)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2832
		txd_lower |= E1000_TXD_CMD_VLE;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2833
		txd_upper |= (tx_flags & E1000_TX_FLAGS_VLAN_MASK);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2834
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2835
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2836
	i = tx_ring->next_to_use;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2837
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2838
	while (count--) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2839
		buffer_info = &tx_ring->buffer_info[i];
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2840
		tx_desc = E1000_TX_DESC(*tx_ring, i);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2841
		tx_desc->buffer_addr = cpu_to_le64(buffer_info->dma);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2842
		tx_desc->lower.data =
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2843
			cpu_to_le32(txd_lower | buffer_info->length);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2844
		tx_desc->upper.data = cpu_to_le32(txd_upper);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2845
		if (unlikely(++i == tx_ring->count)) i = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2846
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2847
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2848
	tx_desc->lower.data |= cpu_to_le32(adapter->txd_cmd);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2849
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2850
	/* Force memory writes to complete before letting h/w
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2851
	 * know there are new descriptors to fetch.  (Only
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2852
	 * applicable for weak-ordered memory model archs,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2853
	 * such as IA-64). */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2854
	wmb();
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2855
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2856
	tx_ring->next_to_use = i;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2857
	writel(i, hw->hw_addr + tx_ring->tdt);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2858
	/* we need this if more than one processor can write to our tail
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2859
	 * at a time, it syncronizes IO on IA64/Altix systems */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2860
	mmiowb();
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2861
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2862
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2863
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2864
 * 82547 workaround to avoid controller hang in half-duplex environment.
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2865
 * The workaround is to avoid queuing a large packet that would span
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2866
 * the internal Tx FIFO ring boundary by notifying the stack to resend
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2867
 * the packet at a later time.  This gives the Tx FIFO an opportunity to
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2868
 * flush all packets.  When that occurs, we reset the Tx FIFO pointers
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2869
 * to the beginning of the Tx FIFO.
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2870
 **/
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2871
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2872
#define E1000_FIFO_HDR			0x10
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2873
#define E1000_82547_PAD_LEN		0x3E0
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2874
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2875
static int e1000_82547_fifo_workaround(struct e1000_adapter *adapter,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2876
				       struct sk_buff *skb)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2877
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2878
	u32 fifo_space = adapter->tx_fifo_size - adapter->tx_fifo_head;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2879
	u32 skb_fifo_len = skb->len + E1000_FIFO_HDR;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2880
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2881
	skb_fifo_len = ALIGN(skb_fifo_len, E1000_FIFO_HDR);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2882
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2883
	if (adapter->link_duplex != HALF_DUPLEX)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2884
		goto no_fifo_stall_required;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2885
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2886
	if (atomic_read(&adapter->tx_fifo_stall))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2887
		return 1;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2888
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2889
	if (skb_fifo_len >= (E1000_82547_PAD_LEN + fifo_space)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2890
		atomic_set(&adapter->tx_fifo_stall, 1);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2891
		return 1;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2892
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2893
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2894
no_fifo_stall_required:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2895
	adapter->tx_fifo_head += skb_fifo_len;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2896
	if (adapter->tx_fifo_head >= adapter->tx_fifo_size)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2897
		adapter->tx_fifo_head -= adapter->tx_fifo_size;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2898
	return 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2899
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2900
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2901
static int __e1000_maybe_stop_tx(struct net_device *netdev, int size)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2902
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2903
	struct e1000_adapter *adapter = netdev_priv(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2904
	struct e1000_tx_ring *tx_ring = adapter->tx_ring;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2905
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2906
	netif_stop_queue(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2907
	/* Herbert's original patch had:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2908
	 *  smp_mb__after_netif_stop_queue();
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2909
	 * but since that doesn't exist yet, just open code it. */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2910
	smp_mb();
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2911
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2912
	/* We need to check again in a case another CPU has just
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2913
	 * made room available. */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2914
	if (likely(E1000_DESC_UNUSED(tx_ring) < size))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2915
		return -EBUSY;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2916
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2917
	/* A reprieve! */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2918
	netif_start_queue(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2919
	++adapter->restart_queue;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2920
	return 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2921
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2922
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2923
static int e1000_maybe_stop_tx(struct net_device *netdev,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2924
                               struct e1000_tx_ring *tx_ring, int size)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2925
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2926
	if (likely(E1000_DESC_UNUSED(tx_ring) >= size))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2927
		return 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2928
	return __e1000_maybe_stop_tx(netdev, size);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2929
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2930
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2931
#define TXD_USE_COUNT(S, X) (((S) >> (X)) + 1 )
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2932
static netdev_tx_t e1000_xmit_frame(struct sk_buff *skb,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2933
				    struct net_device *netdev)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2934
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2935
	struct e1000_adapter *adapter = netdev_priv(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2936
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2937
	struct e1000_tx_ring *tx_ring;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2938
	unsigned int first, max_per_txd = E1000_MAX_DATA_PER_TXD;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2939
	unsigned int max_txd_pwr = E1000_MAX_TXD_PWR;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2940
	unsigned int tx_flags = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2941
	unsigned int len = skb->len - skb->data_len;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2942
	unsigned int nr_frags;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2943
	unsigned int mss;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2944
	int count = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2945
	int tso;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2946
	unsigned int f;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2947
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2948
	/* This goes back to the question of how to logically map a tx queue
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2949
	 * to a flow.  Right now, performance is impacted slightly negatively
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2950
	 * if using multiple tx queues.  If the stack breaks away from a
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2951
	 * single qdisc implementation, we can look at this again. */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2952
	tx_ring = adapter->tx_ring;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2953
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2954
	if (unlikely(skb->len <= 0)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2955
		dev_kfree_skb_any(skb);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2956
		return NETDEV_TX_OK;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2957
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2958
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2959
	mss = skb_shinfo(skb)->gso_size;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2960
	/* The controller does a simple calculation to
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2961
	 * make sure there is enough room in the FIFO before
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2962
	 * initiating the DMA for each buffer.  The calc is:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2963
	 * 4 = ceil(buffer len/mss).  To make sure we don't
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2964
	 * overrun the FIFO, adjust the max buffer len if mss
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2965
	 * drops. */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2966
	if (mss) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2967
		u8 hdr_len;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2968
		max_per_txd = min(mss << 2, max_per_txd);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2969
		max_txd_pwr = fls(max_per_txd) - 1;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2970
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2971
		hdr_len = skb_transport_offset(skb) + tcp_hdrlen(skb);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2972
		if (skb->data_len && hdr_len == len) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2973
			switch (hw->mac_type) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2974
				unsigned int pull_size;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2975
			case e1000_82544:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2976
				/* Make sure we have room to chop off 4 bytes,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2977
				 * and that the end alignment will work out to
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2978
				 * this hardware's requirements
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2979
				 * NOTE: this is a TSO only workaround
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2980
				 * if end byte alignment not correct move us
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2981
				 * into the next dword */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2982
				if ((unsigned long)(skb_tail_pointer(skb) - 1) & 4)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2983
					break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2984
				/* fall through */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2985
				pull_size = min((unsigned int)4, skb->data_len);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2986
				if (!__pskb_pull_tail(skb, pull_size)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2987
					DPRINTK(DRV, ERR,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2988
						"__pskb_pull_tail failed.\n");
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2989
					dev_kfree_skb_any(skb);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2990
					return NETDEV_TX_OK;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2991
				}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2992
				len = skb->len - skb->data_len;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2993
				break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2994
			default:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2995
				/* do nothing */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2996
				break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2997
			}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2998
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2999
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3000
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3001
	/* reserve a descriptor for the offload context */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3002
	if ((mss) || (skb->ip_summed == CHECKSUM_PARTIAL))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3003
		count++;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3004
	count++;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3005
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3006
	/* Controller Erratum workaround */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3007
	if (!skb->data_len && tx_ring->last_tx_tso && !skb_is_gso(skb))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3008
		count++;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3009
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3010
	count += TXD_USE_COUNT(len, max_txd_pwr);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3011
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3012
	if (adapter->pcix_82544)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3013
		count++;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3014
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3015
	/* work-around for errata 10 and it applies to all controllers
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3016
	 * in PCI-X mode, so add one more descriptor to the count
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3017
	 */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3018
	if (unlikely((hw->bus_type == e1000_bus_type_pcix) &&
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3019
			(len > 2015)))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3020
		count++;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3021
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3022
	nr_frags = skb_shinfo(skb)->nr_frags;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3023
	for (f = 0; f < nr_frags; f++)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3024
		count += TXD_USE_COUNT(skb_shinfo(skb)->frags[f].size,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3025
				       max_txd_pwr);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3026
	if (adapter->pcix_82544)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3027
		count += nr_frags;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3028
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3029
	/* need: count + 2 desc gap to keep tail from touching
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3030
	 * head, otherwise try next time */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3031
	if (unlikely(e1000_maybe_stop_tx(netdev, tx_ring, count + 2)))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3032
		return NETDEV_TX_BUSY;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3033
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3034
	if (unlikely(hw->mac_type == e1000_82547)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3035
		if (unlikely(e1000_82547_fifo_workaround(adapter, skb))) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3036
			netif_stop_queue(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3037
			if (!test_bit(__E1000_DOWN, &adapter->flags))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3038
				mod_timer(&adapter->tx_fifo_stall_timer,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3039
				          jiffies + 1);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3040
			return NETDEV_TX_BUSY;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3041
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3042
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3043
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3044
	if (unlikely(adapter->vlgrp && vlan_tx_tag_present(skb))) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3045
		tx_flags |= E1000_TX_FLAGS_VLAN;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3046
		tx_flags |= (vlan_tx_tag_get(skb) << E1000_TX_FLAGS_VLAN_SHIFT);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3047
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3048
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3049
	first = tx_ring->next_to_use;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3050
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3051
	tso = e1000_tso(adapter, tx_ring, skb);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3052
	if (tso < 0) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3053
		dev_kfree_skb_any(skb);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3054
		return NETDEV_TX_OK;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3055
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3056
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3057
	if (likely(tso)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3058
		if (likely(hw->mac_type != e1000_82544))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3059
			tx_ring->last_tx_tso = 1;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3060
		tx_flags |= E1000_TX_FLAGS_TSO;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3061
	} else if (likely(e1000_tx_csum(adapter, tx_ring, skb)))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3062
		tx_flags |= E1000_TX_FLAGS_CSUM;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3063
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3064
	if (likely(skb->protocol == htons(ETH_P_IP)))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3065
		tx_flags |= E1000_TX_FLAGS_IPV4;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3066
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3067
	count = e1000_tx_map(adapter, tx_ring, skb, first, max_per_txd,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3068
	                     nr_frags, mss);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3069
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3070
	if (count) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3071
		e1000_tx_queue(adapter, tx_ring, tx_flags, count);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3072
		/* Make sure there is space in the ring for the next send. */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3073
		e1000_maybe_stop_tx(netdev, tx_ring, MAX_SKB_FRAGS + 2);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3074
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3075
	} else {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3076
		dev_kfree_skb_any(skb);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3077
		tx_ring->buffer_info[first].time_stamp = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3078
		tx_ring->next_to_use = first;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3079
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3080
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3081
	return NETDEV_TX_OK;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3082
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3083
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3084
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3085
 * e1000_tx_timeout - Respond to a Tx Hang
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3086
 * @netdev: network interface device structure
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3087
 **/
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3088
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3089
static void e1000_tx_timeout(struct net_device *netdev)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3090
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3091
	struct e1000_adapter *adapter = netdev_priv(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3092
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3093
	/* Do the reset outside of interrupt context */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3094
	adapter->tx_timeout_count++;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3095
	schedule_work(&adapter->reset_task);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3096
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3097
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3098
static void e1000_reset_task(struct work_struct *work)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3099
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3100
	struct e1000_adapter *adapter =
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3101
		container_of(work, struct e1000_adapter, reset_task);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3102
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3103
	e1000_reinit_locked(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3104
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3105
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3106
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3107
 * e1000_get_stats - Get System Network Statistics
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3108
 * @netdev: network interface device structure
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3109
 *
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3110
 * Returns the address of the device statistics structure.
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3111
 * The statistics are actually updated from the timer callback.
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3112
 **/
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3113
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3114
static struct net_device_stats *e1000_get_stats(struct net_device *netdev)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3115
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3116
	/* only return the current stats */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3117
	return &netdev->stats;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3118
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3119
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3120
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3121
 * e1000_change_mtu - Change the Maximum Transfer Unit
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3122
 * @netdev: network interface device structure
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3123
 * @new_mtu: new value for maximum frame size
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3124
 *
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3125
 * Returns 0 on success, negative on failure
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3126
 **/
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3127
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3128
static int e1000_change_mtu(struct net_device *netdev, int new_mtu)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3129
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3130
	struct e1000_adapter *adapter = netdev_priv(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3131
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3132
	int max_frame = new_mtu + ENET_HEADER_SIZE + ETHERNET_FCS_SIZE;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3133
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3134
	if ((max_frame < MINIMUM_ETHERNET_FRAME_SIZE) ||
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3135
	    (max_frame > MAX_JUMBO_FRAME_SIZE)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3136
		DPRINTK(PROBE, ERR, "Invalid MTU setting\n");
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3137
		return -EINVAL;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3138
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3139
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3140
	/* Adapter-specific max frame size limits. */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3141
	switch (hw->mac_type) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3142
	case e1000_undefined ... e1000_82542_rev2_1:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3143
		if (max_frame > (ETH_FRAME_LEN + ETH_FCS_LEN)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3144
			DPRINTK(PROBE, ERR, "Jumbo Frames not supported.\n");
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3145
			return -EINVAL;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3146
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3147
		break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3148
	default:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3149
		/* Capable of supporting up to MAX_JUMBO_FRAME_SIZE limit. */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3150
		break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3151
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3152
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3153
	while (test_and_set_bit(__E1000_RESETTING, &adapter->flags))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3154
		msleep(1);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3155
	/* e1000_down has a dependency on max_frame_size */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3156
	hw->max_frame_size = max_frame;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3157
	if (netif_running(netdev))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3158
		e1000_down(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3159
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3160
	/* NOTE: netdev_alloc_skb reserves 16 bytes, and typically NET_IP_ALIGN
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3161
	 * means we reserve 2 more, this pushes us to allocate from the next
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3162
	 * larger slab size.
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3163
	 * i.e. RXBUFFER_2048 --> size-4096 slab
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3164
	 *  however with the new *_jumbo_rx* routines, jumbo receives will use
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3165
	 *  fragmented skbs */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3166
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3167
	if (max_frame <= E1000_RXBUFFER_2048)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3168
		adapter->rx_buffer_len = E1000_RXBUFFER_2048;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3169
	else
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3170
#if (PAGE_SIZE >= E1000_RXBUFFER_16384)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3171
		adapter->rx_buffer_len = E1000_RXBUFFER_16384;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3172
#elif (PAGE_SIZE >= E1000_RXBUFFER_4096)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3173
		adapter->rx_buffer_len = PAGE_SIZE;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3174
#endif
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3175
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3176
	/* adjust allocation if LPE protects us, and we aren't using SBP */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3177
	if (!hw->tbi_compatibility_on &&
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3178
	    ((max_frame == (ETH_FRAME_LEN + ETH_FCS_LEN)) ||
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3179
	     (max_frame == MAXIMUM_ETHERNET_VLAN_SIZE)))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3180
		adapter->rx_buffer_len = MAXIMUM_ETHERNET_VLAN_SIZE;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3181
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3182
	printk(KERN_INFO "e1000: %s changing MTU from %d to %d\n",
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3183
	       netdev->name, netdev->mtu, new_mtu);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3184
	netdev->mtu = new_mtu;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3185
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3186
	if (netif_running(netdev))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3187
		e1000_up(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3188
	else
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3189
		e1000_reset(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3190
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3191
	clear_bit(__E1000_RESETTING, &adapter->flags);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3192
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3193
	return 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3194
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3195
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3196
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3197
 * e1000_update_stats - Update the board statistics counters
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3198
 * @adapter: board private structure
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3199
 **/
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3200
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3201
void e1000_update_stats(struct e1000_adapter *adapter)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3202
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3203
	struct net_device *netdev = adapter->netdev;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3204
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3205
	struct pci_dev *pdev = adapter->pdev;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3206
	unsigned long flags;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3207
	u16 phy_tmp;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3208
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3209
#define PHY_IDLE_ERROR_COUNT_MASK 0x00FF
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3210
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3211
	/*
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3212
	 * Prevent stats update while adapter is being reset, or if the pci
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3213
	 * connection is down.
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3214
	 */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3215
	if (adapter->link_speed == 0)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3216
		return;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3217
	if (pci_channel_offline(pdev))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3218
		return;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3219
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3220
	spin_lock_irqsave(&adapter->stats_lock, flags);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3221
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3222
	/* these counters are modified from e1000_tbi_adjust_stats,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3223
	 * called from the interrupt context, so they must only
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3224
	 * be written while holding adapter->stats_lock
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3225
	 */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3226
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3227
	adapter->stats.crcerrs += er32(CRCERRS);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3228
	adapter->stats.gprc += er32(GPRC);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3229
	adapter->stats.gorcl += er32(GORCL);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3230
	adapter->stats.gorch += er32(GORCH);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3231
	adapter->stats.bprc += er32(BPRC);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3232
	adapter->stats.mprc += er32(MPRC);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3233
	adapter->stats.roc += er32(ROC);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3234
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3235
	adapter->stats.prc64 += er32(PRC64);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3236
	adapter->stats.prc127 += er32(PRC127);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3237
	adapter->stats.prc255 += er32(PRC255);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3238
	adapter->stats.prc511 += er32(PRC511);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3239
	adapter->stats.prc1023 += er32(PRC1023);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3240
	adapter->stats.prc1522 += er32(PRC1522);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3241
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3242
	adapter->stats.symerrs += er32(SYMERRS);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3243
	adapter->stats.mpc += er32(MPC);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3244
	adapter->stats.scc += er32(SCC);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3245
	adapter->stats.ecol += er32(ECOL);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3246
	adapter->stats.mcc += er32(MCC);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3247
	adapter->stats.latecol += er32(LATECOL);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3248
	adapter->stats.dc += er32(DC);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3249
	adapter->stats.sec += er32(SEC);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3250
	adapter->stats.rlec += er32(RLEC);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3251
	adapter->stats.xonrxc += er32(XONRXC);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3252
	adapter->stats.xontxc += er32(XONTXC);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3253
	adapter->stats.xoffrxc += er32(XOFFRXC);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3254
	adapter->stats.xofftxc += er32(XOFFTXC);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3255
	adapter->stats.fcruc += er32(FCRUC);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3256
	adapter->stats.gptc += er32(GPTC);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3257
	adapter->stats.gotcl += er32(GOTCL);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3258
	adapter->stats.gotch += er32(GOTCH);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3259
	adapter->stats.rnbc += er32(RNBC);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3260
	adapter->stats.ruc += er32(RUC);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3261
	adapter->stats.rfc += er32(RFC);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3262
	adapter->stats.rjc += er32(RJC);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3263
	adapter->stats.torl += er32(TORL);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3264
	adapter->stats.torh += er32(TORH);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3265
	adapter->stats.totl += er32(TOTL);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3266
	adapter->stats.toth += er32(TOTH);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3267
	adapter->stats.tpr += er32(TPR);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3268
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3269
	adapter->stats.ptc64 += er32(PTC64);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3270
	adapter->stats.ptc127 += er32(PTC127);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3271
	adapter->stats.ptc255 += er32(PTC255);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3272
	adapter->stats.ptc511 += er32(PTC511);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3273
	adapter->stats.ptc1023 += er32(PTC1023);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3274
	adapter->stats.ptc1522 += er32(PTC1522);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3275
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3276
	adapter->stats.mptc += er32(MPTC);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3277
	adapter->stats.bptc += er32(BPTC);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3278
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3279
	/* used for adaptive IFS */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3280
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3281
	hw->tx_packet_delta = er32(TPT);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3282
	adapter->stats.tpt += hw->tx_packet_delta;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3283
	hw->collision_delta = er32(COLC);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3284
	adapter->stats.colc += hw->collision_delta;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3285
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3286
	if (hw->mac_type >= e1000_82543) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3287
		adapter->stats.algnerrc += er32(ALGNERRC);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3288
		adapter->stats.rxerrc += er32(RXERRC);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3289
		adapter->stats.tncrs += er32(TNCRS);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3290
		adapter->stats.cexterr += er32(CEXTERR);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3291
		adapter->stats.tsctc += er32(TSCTC);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3292
		adapter->stats.tsctfc += er32(TSCTFC);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3293
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3294
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3295
	/* Fill out the OS statistics structure */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3296
	netdev->stats.multicast = adapter->stats.mprc;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3297
	netdev->stats.collisions = adapter->stats.colc;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3298
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3299
	/* Rx Errors */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3300
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3301
	/* RLEC on some newer hardware can be incorrect so build
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3302
	* our own version based on RUC and ROC */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3303
	netdev->stats.rx_errors = adapter->stats.rxerrc +
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3304
		adapter->stats.crcerrs + adapter->stats.algnerrc +
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3305
		adapter->stats.ruc + adapter->stats.roc +
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3306
		adapter->stats.cexterr;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3307
	adapter->stats.rlerrc = adapter->stats.ruc + adapter->stats.roc;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3308
	netdev->stats.rx_length_errors = adapter->stats.rlerrc;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3309
	netdev->stats.rx_crc_errors = adapter->stats.crcerrs;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3310
	netdev->stats.rx_frame_errors = adapter->stats.algnerrc;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3311
	netdev->stats.rx_missed_errors = adapter->stats.mpc;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3312
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3313
	/* Tx Errors */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3314
	adapter->stats.txerrc = adapter->stats.ecol + adapter->stats.latecol;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3315
	netdev->stats.tx_errors = adapter->stats.txerrc;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3316
	netdev->stats.tx_aborted_errors = adapter->stats.ecol;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3317
	netdev->stats.tx_window_errors = adapter->stats.latecol;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3318
	netdev->stats.tx_carrier_errors = adapter->stats.tncrs;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3319
	if (hw->bad_tx_carr_stats_fd &&
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3320
	    adapter->link_duplex == FULL_DUPLEX) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3321
		netdev->stats.tx_carrier_errors = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3322
		adapter->stats.tncrs = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3323
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3324
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3325
	/* Tx Dropped needs to be maintained elsewhere */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3326
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3327
	/* Phy Stats */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3328
	if (hw->media_type == e1000_media_type_copper) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3329
		if ((adapter->link_speed == SPEED_1000) &&
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3330
		   (!e1000_read_phy_reg(hw, PHY_1000T_STATUS, &phy_tmp))) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3331
			phy_tmp &= PHY_IDLE_ERROR_COUNT_MASK;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3332
			adapter->phy_stats.idle_errors += phy_tmp;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3333
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3334
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3335
		if ((hw->mac_type <= e1000_82546) &&
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3336
		   (hw->phy_type == e1000_phy_m88) &&
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3337
		   !e1000_read_phy_reg(hw, M88E1000_RX_ERR_CNTR, &phy_tmp))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3338
			adapter->phy_stats.receive_errors += phy_tmp;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3339
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3340
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3341
	/* Management Stats */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3342
	if (hw->has_smbus) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3343
		adapter->stats.mgptc += er32(MGTPTC);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3344
		adapter->stats.mgprc += er32(MGTPRC);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3345
		adapter->stats.mgpdc += er32(MGTPDC);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3346
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3347
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3348
	spin_unlock_irqrestore(&adapter->stats_lock, flags);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3349
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3350
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3351
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3352
 * e1000_intr - Interrupt Handler
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3353
 * @irq: interrupt number
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3354
 * @data: pointer to a network interface device structure
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3355
 **/
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3356
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3357
static irqreturn_t e1000_intr(int irq, void *data)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3358
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3359
	struct net_device *netdev = data;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3360
	struct e1000_adapter *adapter = netdev_priv(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3361
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3362
	u32 icr = er32(ICR);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3363
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3364
	if (unlikely((!icr) || test_bit(__E1000_DOWN, &adapter->flags)))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3365
		return IRQ_NONE;  /* Not our interrupt */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3366
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3367
	if (unlikely(icr & (E1000_ICR_RXSEQ | E1000_ICR_LSC))) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3368
		hw->get_link_status = 1;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3369
		/* guard against interrupt when we're going down */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3370
		if (!test_bit(__E1000_DOWN, &adapter->flags))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3371
			mod_timer(&adapter->watchdog_timer, jiffies + 1);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3372
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3373
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3374
	/* disable interrupts, without the synchronize_irq bit */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3375
	ew32(IMC, ~0);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3376
	E1000_WRITE_FLUSH();
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3377
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3378
	if (likely(napi_schedule_prep(&adapter->napi))) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3379
		adapter->total_tx_bytes = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3380
		adapter->total_tx_packets = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3381
		adapter->total_rx_bytes = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3382
		adapter->total_rx_packets = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3383
		__napi_schedule(&adapter->napi);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3384
	} else {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3385
		/* this really should not happen! if it does it is basically a
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3386
		 * bug, but not a hard error, so enable ints and continue */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3387
		if (!test_bit(__E1000_DOWN, &adapter->flags))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3388
			e1000_irq_enable(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3389
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3390
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3391
	return IRQ_HANDLED;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3392
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3393
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3394
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3395
 * e1000_clean - NAPI Rx polling callback
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3396
 * @adapter: board private structure
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3397
 **/
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3398
static int e1000_clean(struct napi_struct *napi, int budget)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3399
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3400
	struct e1000_adapter *adapter = container_of(napi, struct e1000_adapter, napi);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3401
	int tx_clean_complete = 0, work_done = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3402
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3403
	tx_clean_complete = e1000_clean_tx_irq(adapter, &adapter->tx_ring[0]);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3404
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3405
	adapter->clean_rx(adapter, &adapter->rx_ring[0], &work_done, budget);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3406
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3407
	if (!tx_clean_complete)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3408
		work_done = budget;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3409
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3410
	/* If budget not fully consumed, exit the polling mode */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3411
	if (work_done < budget) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3412
		if (likely(adapter->itr_setting & 3))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3413
			e1000_set_itr(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3414
		napi_complete(napi);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3415
		if (!test_bit(__E1000_DOWN, &adapter->flags))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3416
			e1000_irq_enable(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3417
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3418
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3419
	return work_done;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3420
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3421
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3422
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3423
 * e1000_clean_tx_irq - Reclaim resources after transmit completes
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3424
 * @adapter: board private structure
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3425
 **/
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3426
static bool e1000_clean_tx_irq(struct e1000_adapter *adapter,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3427
			       struct e1000_tx_ring *tx_ring)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3428
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3429
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3430
	struct net_device *netdev = adapter->netdev;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3431
	struct e1000_tx_desc *tx_desc, *eop_desc;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3432
	struct e1000_buffer *buffer_info;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3433
	unsigned int i, eop;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3434
	unsigned int count = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3435
	unsigned int total_tx_bytes=0, total_tx_packets=0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3436
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3437
	i = tx_ring->next_to_clean;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3438
	eop = tx_ring->buffer_info[i].next_to_watch;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3439
	eop_desc = E1000_TX_DESC(*tx_ring, eop);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3440
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3441
	while ((eop_desc->upper.data & cpu_to_le32(E1000_TXD_STAT_DD)) &&
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3442
	       (count < tx_ring->count)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3443
		bool cleaned = false;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3444
		for ( ; !cleaned; count++) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3445
			tx_desc = E1000_TX_DESC(*tx_ring, i);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3446
			buffer_info = &tx_ring->buffer_info[i];
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3447
			cleaned = (i == eop);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3448
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3449
			if (cleaned) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3450
				struct sk_buff *skb = buffer_info->skb;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3451
				unsigned int segs, bytecount;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3452
				segs = skb_shinfo(skb)->gso_segs ?: 1;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3453
				/* multiply data chunks by size of headers */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3454
				bytecount = ((segs - 1) * skb_headlen(skb)) +
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3455
				            skb->len;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3456
				total_tx_packets += segs;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3457
				total_tx_bytes += bytecount;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3458
			}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3459
			e1000_unmap_and_free_tx_resource(adapter, buffer_info);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3460
			tx_desc->upper.data = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3461
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3462
			if (unlikely(++i == tx_ring->count)) i = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3463
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3464
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3465
		eop = tx_ring->buffer_info[i].next_to_watch;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3466
		eop_desc = E1000_TX_DESC(*tx_ring, eop);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3467
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3468
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3469
	tx_ring->next_to_clean = i;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3470
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3471
#define TX_WAKE_THRESHOLD 32
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3472
	if (unlikely(count && netif_carrier_ok(netdev) &&
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3473
		     E1000_DESC_UNUSED(tx_ring) >= TX_WAKE_THRESHOLD)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3474
		/* Make sure that anybody stopping the queue after this
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3475
		 * sees the new next_to_clean.
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3476
		 */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3477
		smp_mb();
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3478
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3479
		if (netif_queue_stopped(netdev) &&
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3480
		    !(test_bit(__E1000_DOWN, &adapter->flags))) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3481
			netif_wake_queue(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3482
			++adapter->restart_queue;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3483
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3484
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3485
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3486
	if (adapter->detect_tx_hung) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3487
		/* Detect a transmit hang in hardware, this serializes the
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3488
		 * check with the clearing of time_stamp and movement of i */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3489
		adapter->detect_tx_hung = false;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3490
		if (tx_ring->buffer_info[eop].time_stamp &&
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3491
		    time_after(jiffies, tx_ring->buffer_info[eop].time_stamp +
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3492
		               (adapter->tx_timeout_factor * HZ)) &&
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3493
		    !(er32(STATUS) & E1000_STATUS_TXOFF)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3494
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3495
			/* detected Tx unit hang */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3496
			DPRINTK(DRV, ERR, "Detected Tx Unit Hang\n"
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3497
					"  Tx Queue             <%lu>\n"
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3498
					"  TDH                  <%x>\n"
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3499
					"  TDT                  <%x>\n"
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3500
					"  next_to_use          <%x>\n"
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3501
					"  next_to_clean        <%x>\n"
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3502
					"buffer_info[next_to_clean]\n"
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3503
					"  time_stamp           <%lx>\n"
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3504
					"  next_to_watch        <%x>\n"
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3505
					"  jiffies              <%lx>\n"
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3506
					"  next_to_watch.status <%x>\n",
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3507
				(unsigned long)((tx_ring - adapter->tx_ring) /
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3508
					sizeof(struct e1000_tx_ring)),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3509
				readl(hw->hw_addr + tx_ring->tdh),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3510
				readl(hw->hw_addr + tx_ring->tdt),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3511
				tx_ring->next_to_use,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3512
				tx_ring->next_to_clean,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3513
				tx_ring->buffer_info[eop].time_stamp,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3514
				eop,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3515
				jiffies,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3516
				eop_desc->upper.fields.status);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3517
			netif_stop_queue(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3518
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3519
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3520
	adapter->total_tx_bytes += total_tx_bytes;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3521
	adapter->total_tx_packets += total_tx_packets;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3522
	netdev->stats.tx_bytes += total_tx_bytes;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3523
	netdev->stats.tx_packets += total_tx_packets;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3524
	return (count < tx_ring->count);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3525
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3526
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3527
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3528
 * e1000_rx_checksum - Receive Checksum Offload for 82543
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3529
 * @adapter:     board private structure
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3530
 * @status_err:  receive descriptor status and error fields
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3531
 * @csum:        receive descriptor csum field
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3532
 * @sk_buff:     socket buffer with received data
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3533
 **/
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3534
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3535
static void e1000_rx_checksum(struct e1000_adapter *adapter, u32 status_err,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3536
			      u32 csum, struct sk_buff *skb)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3537
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3538
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3539
	u16 status = (u16)status_err;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3540
	u8 errors = (u8)(status_err >> 24);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3541
	skb->ip_summed = CHECKSUM_NONE;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3542
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3543
	/* 82543 or newer only */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3544
	if (unlikely(hw->mac_type < e1000_82543)) return;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3545
	/* Ignore Checksum bit is set */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3546
	if (unlikely(status & E1000_RXD_STAT_IXSM)) return;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3547
	/* TCP/UDP checksum error bit is set */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3548
	if (unlikely(errors & E1000_RXD_ERR_TCPE)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3549
		/* let the stack verify checksum errors */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3550
		adapter->hw_csum_err++;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3551
		return;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3552
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3553
	/* TCP/UDP Checksum has not been calculated */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3554
	if (!(status & E1000_RXD_STAT_TCPCS))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3555
		return;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3556
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3557
	/* It must be a TCP or UDP packet with a valid checksum */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3558
	if (likely(status & E1000_RXD_STAT_TCPCS)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3559
		/* TCP checksum is good */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3560
		skb->ip_summed = CHECKSUM_UNNECESSARY;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3561
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3562
	adapter->hw_csum_good++;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3563
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3564
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3565
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3566
 * e1000_consume_page - helper function
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3567
 **/
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3568
static void e1000_consume_page(struct e1000_buffer *bi, struct sk_buff *skb,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3569
                               u16 length)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3570
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3571
	bi->page = NULL;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3572
	skb->len += length;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3573
	skb->data_len += length;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3574
	skb->truesize += length;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3575
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3576
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3577
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3578
 * e1000_receive_skb - helper function to handle rx indications
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3579
 * @adapter: board private structure
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3580
 * @status: descriptor status field as written by hardware
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3581
 * @vlan: descriptor vlan field as written by hardware (no le/be conversion)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3582
 * @skb: pointer to sk_buff to be indicated to stack
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3583
 */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3584
static void e1000_receive_skb(struct e1000_adapter *adapter, u8 status,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3585
			      __le16 vlan, struct sk_buff *skb)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3586
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3587
	if (unlikely(adapter->vlgrp && (status & E1000_RXD_STAT_VP))) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3588
		vlan_hwaccel_receive_skb(skb, adapter->vlgrp,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3589
		                         le16_to_cpu(vlan) &
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3590
		                         E1000_RXD_SPC_VLAN_MASK);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3591
	} else {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3592
		netif_receive_skb(skb);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3593
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3594
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3595
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3596
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3597
 * e1000_clean_jumbo_rx_irq - Send received data up the network stack; legacy
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3598
 * @adapter: board private structure
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3599
 * @rx_ring: ring to clean
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3600
 * @work_done: amount of napi work completed this call
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3601
 * @work_to_do: max amount of work allowed for this call to do
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3602
 *
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3603
 * the return value indicates whether actual cleaning was done, there
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3604
 * is no guarantee that everything was cleaned
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3605
 */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3606
static bool e1000_clean_jumbo_rx_irq(struct e1000_adapter *adapter,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3607
				     struct e1000_rx_ring *rx_ring,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3608
				     int *work_done, int work_to_do)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3609
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3610
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3611
	struct net_device *netdev = adapter->netdev;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3612
	struct pci_dev *pdev = adapter->pdev;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3613
	struct e1000_rx_desc *rx_desc, *next_rxd;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3614
	struct e1000_buffer *buffer_info, *next_buffer;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3615
	unsigned long irq_flags;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3616
	u32 length;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3617
	unsigned int i;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3618
	int cleaned_count = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3619
	bool cleaned = false;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3620
	unsigned int total_rx_bytes=0, total_rx_packets=0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3621
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3622
	i = rx_ring->next_to_clean;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3623
	rx_desc = E1000_RX_DESC(*rx_ring, i);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3624
	buffer_info = &rx_ring->buffer_info[i];
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3625
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3626
	while (rx_desc->status & E1000_RXD_STAT_DD) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3627
		struct sk_buff *skb;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3628
		u8 status;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3629
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3630
		if (*work_done >= work_to_do)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3631
			break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3632
		(*work_done)++;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3633
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3634
		status = rx_desc->status;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3635
		skb = buffer_info->skb;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3636
		buffer_info->skb = NULL;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3637
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3638
		if (++i == rx_ring->count) i = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3639
		next_rxd = E1000_RX_DESC(*rx_ring, i);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3640
		prefetch(next_rxd);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3641
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3642
		next_buffer = &rx_ring->buffer_info[i];
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3643
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3644
		cleaned = true;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3645
		cleaned_count++;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3646
		pci_unmap_page(pdev, buffer_info->dma, buffer_info->length,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3647
		               PCI_DMA_FROMDEVICE);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3648
		buffer_info->dma = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3649
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3650
		length = le16_to_cpu(rx_desc->length);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3651
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3652
		/* errors is only valid for DD + EOP descriptors */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3653
		if (unlikely((status & E1000_RXD_STAT_EOP) &&
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3654
		    (rx_desc->errors & E1000_RXD_ERR_FRAME_ERR_MASK))) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3655
			u8 last_byte = *(skb->data + length - 1);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3656
			if (TBI_ACCEPT(hw, status, rx_desc->errors, length,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3657
				       last_byte)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3658
				spin_lock_irqsave(&adapter->stats_lock,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3659
				                  irq_flags);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3660
				e1000_tbi_adjust_stats(hw, &adapter->stats,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3661
				                       length, skb->data);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3662
				spin_unlock_irqrestore(&adapter->stats_lock,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3663
				                       irq_flags);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3664
				length--;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3665
			} else {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3666
				/* recycle both page and skb */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3667
				buffer_info->skb = skb;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3668
				/* an error means any chain goes out the window
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3669
				 * too */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3670
				if (rx_ring->rx_skb_top)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3671
					dev_kfree_skb(rx_ring->rx_skb_top);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3672
				rx_ring->rx_skb_top = NULL;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3673
				goto next_desc;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3674
			}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3675
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3676
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3677
#define rxtop rx_ring->rx_skb_top
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3678
		if (!(status & E1000_RXD_STAT_EOP)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3679
			/* this descriptor is only the beginning (or middle) */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3680
			if (!rxtop) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3681
				/* this is the beginning of a chain */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3682
				rxtop = skb;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3683
				skb_fill_page_desc(rxtop, 0, buffer_info->page,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3684
				                   0, length);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3685
			} else {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3686
				/* this is the middle of a chain */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3687
				skb_fill_page_desc(rxtop,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3688
				    skb_shinfo(rxtop)->nr_frags,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3689
				    buffer_info->page, 0, length);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3690
				/* re-use the skb, only consumed the page */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3691
				buffer_info->skb = skb;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3692
			}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3693
			e1000_consume_page(buffer_info, rxtop, length);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3694
			goto next_desc;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3695
		} else {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3696
			if (rxtop) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3697
				/* end of the chain */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3698
				skb_fill_page_desc(rxtop,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3699
				    skb_shinfo(rxtop)->nr_frags,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3700
				    buffer_info->page, 0, length);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3701
				/* re-use the current skb, we only consumed the
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3702
				 * page */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3703
				buffer_info->skb = skb;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3704
				skb = rxtop;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3705
				rxtop = NULL;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3706
				e1000_consume_page(buffer_info, skb, length);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3707
			} else {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3708
				/* no chain, got EOP, this buf is the packet
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3709
				 * copybreak to save the put_page/alloc_page */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3710
				if (length <= copybreak &&
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3711
				    skb_tailroom(skb) >= length) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3712
					u8 *vaddr;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3713
					vaddr = kmap_atomic(buffer_info->page,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3714
					                    KM_SKB_DATA_SOFTIRQ);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3715
					memcpy(skb_tail_pointer(skb), vaddr, length);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3716
					kunmap_atomic(vaddr,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3717
					              KM_SKB_DATA_SOFTIRQ);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3718
					/* re-use the page, so don't erase
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3719
					 * buffer_info->page */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3720
					skb_put(skb, length);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3721
				} else {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3722
					skb_fill_page_desc(skb, 0,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3723
					                   buffer_info->page, 0,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3724
				                           length);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3725
					e1000_consume_page(buffer_info, skb,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3726
					                   length);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3727
				}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3728
			}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3729
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3730
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3731
		/* Receive Checksum Offload XXX recompute due to CRC strip? */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3732
		e1000_rx_checksum(adapter,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3733
		                  (u32)(status) |
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3734
		                  ((u32)(rx_desc->errors) << 24),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3735
		                  le16_to_cpu(rx_desc->csum), skb);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3736
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3737
		pskb_trim(skb, skb->len - 4);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3738
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3739
		/* probably a little skewed due to removing CRC */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3740
		total_rx_bytes += skb->len;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3741
		total_rx_packets++;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3742
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3743
		/* eth type trans needs skb->data to point to something */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3744
		if (!pskb_may_pull(skb, ETH_HLEN)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3745
			DPRINTK(DRV, ERR, "pskb_may_pull failed.\n");
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3746
			dev_kfree_skb(skb);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3747
			goto next_desc;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3748
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3749
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3750
		skb->protocol = eth_type_trans(skb, netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3751
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3752
		e1000_receive_skb(adapter, status, rx_desc->special, skb);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3753
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3754
next_desc:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3755
		rx_desc->status = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3756
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3757
		/* return some buffers to hardware, one at a time is too slow */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3758
		if (unlikely(cleaned_count >= E1000_RX_BUFFER_WRITE)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3759
			adapter->alloc_rx_buf(adapter, rx_ring, cleaned_count);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3760
			cleaned_count = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3761
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3762
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3763
		/* use prefetched values */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3764
		rx_desc = next_rxd;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3765
		buffer_info = next_buffer;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3766
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3767
	rx_ring->next_to_clean = i;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3768
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3769
	cleaned_count = E1000_DESC_UNUSED(rx_ring);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3770
	if (cleaned_count)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3771
		adapter->alloc_rx_buf(adapter, rx_ring, cleaned_count);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3772
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3773
	adapter->total_rx_packets += total_rx_packets;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3774
	adapter->total_rx_bytes += total_rx_bytes;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3775
	netdev->stats.rx_bytes += total_rx_bytes;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3776
	netdev->stats.rx_packets += total_rx_packets;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3777
	return cleaned;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3778
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3779
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3780
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3781
 * e1000_clean_rx_irq - Send received data up the network stack; legacy
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3782
 * @adapter: board private structure
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3783
 * @rx_ring: ring to clean
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3784
 * @work_done: amount of napi work completed this call
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3785
 * @work_to_do: max amount of work allowed for this call to do
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3786
 */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3787
static bool e1000_clean_rx_irq(struct e1000_adapter *adapter,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3788
			       struct e1000_rx_ring *rx_ring,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3789
			       int *work_done, int work_to_do)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3790
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3791
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3792
	struct net_device *netdev = adapter->netdev;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3793
	struct pci_dev *pdev = adapter->pdev;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3794
	struct e1000_rx_desc *rx_desc, *next_rxd;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3795
	struct e1000_buffer *buffer_info, *next_buffer;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3796
	unsigned long flags;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3797
	u32 length;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3798
	unsigned int i;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3799
	int cleaned_count = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3800
	bool cleaned = false;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3801
	unsigned int total_rx_bytes=0, total_rx_packets=0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3802
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3803
	i = rx_ring->next_to_clean;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3804
	rx_desc = E1000_RX_DESC(*rx_ring, i);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3805
	buffer_info = &rx_ring->buffer_info[i];
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3806
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3807
	while (rx_desc->status & E1000_RXD_STAT_DD) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3808
		struct sk_buff *skb;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3809
		u8 status;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3810
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3811
		if (*work_done >= work_to_do)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3812
			break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3813
		(*work_done)++;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3814
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3815
		status = rx_desc->status;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3816
		skb = buffer_info->skb;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3817
		buffer_info->skb = NULL;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3818
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3819
		prefetch(skb->data - NET_IP_ALIGN);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3820
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3821
		if (++i == rx_ring->count) i = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3822
		next_rxd = E1000_RX_DESC(*rx_ring, i);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3823
		prefetch(next_rxd);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3824
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3825
		next_buffer = &rx_ring->buffer_info[i];
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3826
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3827
		cleaned = true;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3828
		cleaned_count++;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3829
		pci_unmap_single(pdev, buffer_info->dma, buffer_info->length,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3830
		                 PCI_DMA_FROMDEVICE);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3831
		buffer_info->dma = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3832
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3833
		length = le16_to_cpu(rx_desc->length);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3834
		/* !EOP means multiple descriptors were used to store a single
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3835
		 * packet, if thats the case we need to toss it.  In fact, we
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3836
		 * to toss every packet with the EOP bit clear and the next
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3837
		 * frame that _does_ have the EOP bit set, as it is by
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3838
		 * definition only a frame fragment
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3839
		 */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3840
		if (unlikely(!(status & E1000_RXD_STAT_EOP)))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3841
			adapter->discarding = true;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3842
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3843
		if (adapter->discarding) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3844
			/* All receives must fit into a single buffer */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3845
			E1000_DBG("%s: Receive packet consumed multiple"
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3846
				  " buffers\n", netdev->name);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3847
			/* recycle */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3848
			buffer_info->skb = skb;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3849
			if (status & E1000_RXD_STAT_EOP)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3850
				adapter->discarding = false;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3851
			goto next_desc;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3852
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3853
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3854
		if (unlikely(rx_desc->errors & E1000_RXD_ERR_FRAME_ERR_MASK)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3855
			u8 last_byte = *(skb->data + length - 1);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3856
			if (TBI_ACCEPT(hw, status, rx_desc->errors, length,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3857
				       last_byte)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3858
				spin_lock_irqsave(&adapter->stats_lock, flags);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3859
				e1000_tbi_adjust_stats(hw, &adapter->stats,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3860
				                       length, skb->data);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3861
				spin_unlock_irqrestore(&adapter->stats_lock,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3862
				                       flags);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3863
				length--;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3864
			} else {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3865
				/* recycle */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3866
				buffer_info->skb = skb;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3867
				goto next_desc;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3868
			}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3869
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3870
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3871
		/* adjust length to remove Ethernet CRC, this must be
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3872
		 * done after the TBI_ACCEPT workaround above */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3873
		length -= 4;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3874
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3875
		/* probably a little skewed due to removing CRC */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3876
		total_rx_bytes += length;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3877
		total_rx_packets++;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3878
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3879
		/* code added for copybreak, this should improve
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3880
		 * performance for small packets with large amounts
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3881
		 * of reassembly being done in the stack */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3882
		if (length < copybreak) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3883
			struct sk_buff *new_skb =
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3884
			    netdev_alloc_skb_ip_align(netdev, length);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3885
			if (new_skb) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3886
				skb_copy_to_linear_data_offset(new_skb,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3887
							       -NET_IP_ALIGN,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3888
							       (skb->data -
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3889
							        NET_IP_ALIGN),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3890
							       (length +
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3891
							        NET_IP_ALIGN));
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3892
				/* save the skb in buffer_info as good */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3893
				buffer_info->skb = skb;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3894
				skb = new_skb;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3895
			}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3896
			/* else just continue with the old one */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3897
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3898
		/* end copybreak code */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3899
		skb_put(skb, length);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3900
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3901
		/* Receive Checksum Offload */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3902
		e1000_rx_checksum(adapter,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3903
				  (u32)(status) |
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3904
				  ((u32)(rx_desc->errors) << 24),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3905
				  le16_to_cpu(rx_desc->csum), skb);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3906
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3907
		skb->protocol = eth_type_trans(skb, netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3908
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3909
		e1000_receive_skb(adapter, status, rx_desc->special, skb);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3910
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3911
next_desc:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3912
		rx_desc->status = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3913
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3914
		/* return some buffers to hardware, one at a time is too slow */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3915
		if (unlikely(cleaned_count >= E1000_RX_BUFFER_WRITE)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3916
			adapter->alloc_rx_buf(adapter, rx_ring, cleaned_count);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3917
			cleaned_count = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3918
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3919
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3920
		/* use prefetched values */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3921
		rx_desc = next_rxd;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3922
		buffer_info = next_buffer;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3923
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3924
	rx_ring->next_to_clean = i;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3925
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3926
	cleaned_count = E1000_DESC_UNUSED(rx_ring);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3927
	if (cleaned_count)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3928
		adapter->alloc_rx_buf(adapter, rx_ring, cleaned_count);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3929
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3930
	adapter->total_rx_packets += total_rx_packets;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3931
	adapter->total_rx_bytes += total_rx_bytes;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3932
	netdev->stats.rx_bytes += total_rx_bytes;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3933
	netdev->stats.rx_packets += total_rx_packets;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3934
	return cleaned;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3935
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3936
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3937
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3938
 * e1000_alloc_jumbo_rx_buffers - Replace used jumbo receive buffers
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3939
 * @adapter: address of board private structure
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3940
 * @rx_ring: pointer to receive ring structure
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3941
 * @cleaned_count: number of buffers to allocate this pass
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3942
 **/
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3943
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3944
static void
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3945
e1000_alloc_jumbo_rx_buffers(struct e1000_adapter *adapter,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3946
                             struct e1000_rx_ring *rx_ring, int cleaned_count)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3947
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3948
	struct net_device *netdev = adapter->netdev;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3949
	struct pci_dev *pdev = adapter->pdev;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3950
	struct e1000_rx_desc *rx_desc;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3951
	struct e1000_buffer *buffer_info;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3952
	struct sk_buff *skb;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3953
	unsigned int i;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3954
	unsigned int bufsz = 256 - 16 /*for skb_reserve */ ;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3955
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3956
	i = rx_ring->next_to_use;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3957
	buffer_info = &rx_ring->buffer_info[i];
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3958
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3959
	while (cleaned_count--) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3960
		skb = buffer_info->skb;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3961
		if (skb) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3962
			skb_trim(skb, 0);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3963
			goto check_page;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3964
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3965
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3966
		skb = netdev_alloc_skb_ip_align(netdev, bufsz);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3967
		if (unlikely(!skb)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3968
			/* Better luck next round */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3969
			adapter->alloc_rx_buff_failed++;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3970
			break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3971
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3972
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3973
		/* Fix for errata 23, can't cross 64kB boundary */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3974
		if (!e1000_check_64k_bound(adapter, skb->data, bufsz)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3975
			struct sk_buff *oldskb = skb;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3976
			DPRINTK(PROBE, ERR, "skb align check failed: %u bytes "
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3977
					     "at %p\n", bufsz, skb->data);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3978
			/* Try again, without freeing the previous */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3979
			skb = netdev_alloc_skb_ip_align(netdev, bufsz);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3980
			/* Failed allocation, critical failure */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3981
			if (!skb) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3982
				dev_kfree_skb(oldskb);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3983
				adapter->alloc_rx_buff_failed++;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3984
				break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3985
			}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3986
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3987
			if (!e1000_check_64k_bound(adapter, skb->data, bufsz)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3988
				/* give up */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3989
				dev_kfree_skb(skb);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3990
				dev_kfree_skb(oldskb);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3991
				break; /* while (cleaned_count--) */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3992
			}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3993
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3994
			/* Use new allocation */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3995
			dev_kfree_skb(oldskb);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3996
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3997
		buffer_info->skb = skb;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3998
		buffer_info->length = adapter->rx_buffer_len;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3999
check_page:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4000
		/* allocate a new page if necessary */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4001
		if (!buffer_info->page) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4002
			buffer_info->page = alloc_page(GFP_ATOMIC);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4003
			if (unlikely(!buffer_info->page)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4004
				adapter->alloc_rx_buff_failed++;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4005
				break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4006
			}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4007
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4008
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4009
		if (!buffer_info->dma) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4010
			buffer_info->dma = pci_map_page(pdev,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4011
			                                buffer_info->page, 0,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4012
			                                buffer_info->length,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4013
			                                PCI_DMA_FROMDEVICE);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4014
			if (pci_dma_mapping_error(pdev, buffer_info->dma)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4015
				put_page(buffer_info->page);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4016
				dev_kfree_skb(skb);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4017
				buffer_info->page = NULL;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4018
				buffer_info->skb = NULL;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4019
				buffer_info->dma = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4020
				adapter->alloc_rx_buff_failed++;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4021
				break; /* while !buffer_info->skb */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4022
			}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4023
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4024
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4025
		rx_desc = E1000_RX_DESC(*rx_ring, i);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4026
		rx_desc->buffer_addr = cpu_to_le64(buffer_info->dma);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4027
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4028
		if (unlikely(++i == rx_ring->count))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4029
			i = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4030
		buffer_info = &rx_ring->buffer_info[i];
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4031
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4032
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4033
	if (likely(rx_ring->next_to_use != i)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4034
		rx_ring->next_to_use = i;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4035
		if (unlikely(i-- == 0))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4036
			i = (rx_ring->count - 1);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4037
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4038
		/* Force memory writes to complete before letting h/w
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4039
		 * know there are new descriptors to fetch.  (Only
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4040
		 * applicable for weak-ordered memory model archs,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4041
		 * such as IA-64). */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4042
		wmb();
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4043
		writel(i, adapter->hw.hw_addr + rx_ring->rdt);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4044
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4045
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4046
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4047
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4048
 * e1000_alloc_rx_buffers - Replace used receive buffers; legacy & extended
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4049
 * @adapter: address of board private structure
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4050
 **/
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4051
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4052
static void e1000_alloc_rx_buffers(struct e1000_adapter *adapter,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4053
				   struct e1000_rx_ring *rx_ring,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4054
				   int cleaned_count)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4055
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4056
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4057
	struct net_device *netdev = adapter->netdev;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4058
	struct pci_dev *pdev = adapter->pdev;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4059
	struct e1000_rx_desc *rx_desc;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4060
	struct e1000_buffer *buffer_info;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4061
	struct sk_buff *skb;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4062
	unsigned int i;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4063
	unsigned int bufsz = adapter->rx_buffer_len;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4064
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4065
	i = rx_ring->next_to_use;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4066
	buffer_info = &rx_ring->buffer_info[i];
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4067
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4068
	while (cleaned_count--) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4069
		skb = buffer_info->skb;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4070
		if (skb) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4071
			skb_trim(skb, 0);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4072
			goto map_skb;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4073
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4074
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4075
		skb = netdev_alloc_skb_ip_align(netdev, bufsz);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4076
		if (unlikely(!skb)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4077
			/* Better luck next round */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4078
			adapter->alloc_rx_buff_failed++;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4079
			break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4080
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4081
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4082
		/* Fix for errata 23, can't cross 64kB boundary */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4083
		if (!e1000_check_64k_bound(adapter, skb->data, bufsz)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4084
			struct sk_buff *oldskb = skb;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4085
			DPRINTK(RX_ERR, ERR, "skb align check failed: %u bytes "
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4086
					     "at %p\n", bufsz, skb->data);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4087
			/* Try again, without freeing the previous */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4088
			skb = netdev_alloc_skb_ip_align(netdev, bufsz);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4089
			/* Failed allocation, critical failure */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4090
			if (!skb) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4091
				dev_kfree_skb(oldskb);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4092
				adapter->alloc_rx_buff_failed++;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4093
				break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4094
			}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4095
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4096
			if (!e1000_check_64k_bound(adapter, skb->data, bufsz)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4097
				/* give up */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4098
				dev_kfree_skb(skb);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4099
				dev_kfree_skb(oldskb);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4100
				adapter->alloc_rx_buff_failed++;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4101
				break; /* while !buffer_info->skb */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4102
			}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4103
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4104
			/* Use new allocation */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4105
			dev_kfree_skb(oldskb);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4106
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4107
		buffer_info->skb = skb;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4108
		buffer_info->length = adapter->rx_buffer_len;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4109
map_skb:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4110
		buffer_info->dma = pci_map_single(pdev,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4111
						  skb->data,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4112
						  buffer_info->length,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4113
						  PCI_DMA_FROMDEVICE);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4114
		if (pci_dma_mapping_error(pdev, buffer_info->dma)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4115
			dev_kfree_skb(skb);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4116
			buffer_info->skb = NULL;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4117
			buffer_info->dma = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4118
			adapter->alloc_rx_buff_failed++;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4119
			break; /* while !buffer_info->skb */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4120
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4121
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4122
		/*
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4123
		 * XXX if it was allocated cleanly it will never map to a
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4124
		 * boundary crossing
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4125
		 */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4126
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4127
		/* Fix for errata 23, can't cross 64kB boundary */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4128
		if (!e1000_check_64k_bound(adapter,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4129
					(void *)(unsigned long)buffer_info->dma,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4130
					adapter->rx_buffer_len)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4131
			DPRINTK(RX_ERR, ERR,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4132
				"dma align check failed: %u bytes at %p\n",
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4133
				adapter->rx_buffer_len,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4134
				(void *)(unsigned long)buffer_info->dma);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4135
			dev_kfree_skb(skb);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4136
			buffer_info->skb = NULL;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4137
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4138
			pci_unmap_single(pdev, buffer_info->dma,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4139
					 adapter->rx_buffer_len,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4140
					 PCI_DMA_FROMDEVICE);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4141
			buffer_info->dma = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4142
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4143
			adapter->alloc_rx_buff_failed++;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4144
			break; /* while !buffer_info->skb */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4145
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4146
		rx_desc = E1000_RX_DESC(*rx_ring, i);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4147
		rx_desc->buffer_addr = cpu_to_le64(buffer_info->dma);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4148
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4149
		if (unlikely(++i == rx_ring->count))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4150
			i = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4151
		buffer_info = &rx_ring->buffer_info[i];
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4152
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4153
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4154
	if (likely(rx_ring->next_to_use != i)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4155
		rx_ring->next_to_use = i;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4156
		if (unlikely(i-- == 0))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4157
			i = (rx_ring->count - 1);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4158
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4159
		/* Force memory writes to complete before letting h/w
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4160
		 * know there are new descriptors to fetch.  (Only
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4161
		 * applicable for weak-ordered memory model archs,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4162
		 * such as IA-64). */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4163
		wmb();
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4164
		writel(i, hw->hw_addr + rx_ring->rdt);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4165
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4166
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4167
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4168
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4169
 * e1000_smartspeed - Workaround for SmartSpeed on 82541 and 82547 controllers.
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4170
 * @adapter:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4171
 **/
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4172
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4173
static void e1000_smartspeed(struct e1000_adapter *adapter)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4174
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4175
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4176
	u16 phy_status;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4177
	u16 phy_ctrl;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4178
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4179
	if ((hw->phy_type != e1000_phy_igp) || !hw->autoneg ||
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4180
	   !(hw->autoneg_advertised & ADVERTISE_1000_FULL))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4181
		return;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4182
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4183
	if (adapter->smartspeed == 0) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4184
		/* If Master/Slave config fault is asserted twice,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4185
		 * we assume back-to-back */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4186
		e1000_read_phy_reg(hw, PHY_1000T_STATUS, &phy_status);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4187
		if (!(phy_status & SR_1000T_MS_CONFIG_FAULT)) return;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4188
		e1000_read_phy_reg(hw, PHY_1000T_STATUS, &phy_status);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4189
		if (!(phy_status & SR_1000T_MS_CONFIG_FAULT)) return;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4190
		e1000_read_phy_reg(hw, PHY_1000T_CTRL, &phy_ctrl);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4191
		if (phy_ctrl & CR_1000T_MS_ENABLE) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4192
			phy_ctrl &= ~CR_1000T_MS_ENABLE;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4193
			e1000_write_phy_reg(hw, PHY_1000T_CTRL,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4194
					    phy_ctrl);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4195
			adapter->smartspeed++;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4196
			if (!e1000_phy_setup_autoneg(hw) &&
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4197
			   !e1000_read_phy_reg(hw, PHY_CTRL,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4198
				   	       &phy_ctrl)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4199
				phy_ctrl |= (MII_CR_AUTO_NEG_EN |
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4200
					     MII_CR_RESTART_AUTO_NEG);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4201
				e1000_write_phy_reg(hw, PHY_CTRL,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4202
						    phy_ctrl);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4203
			}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4204
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4205
		return;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4206
	} else if (adapter->smartspeed == E1000_SMARTSPEED_DOWNSHIFT) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4207
		/* If still no link, perhaps using 2/3 pair cable */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4208
		e1000_read_phy_reg(hw, PHY_1000T_CTRL, &phy_ctrl);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4209
		phy_ctrl |= CR_1000T_MS_ENABLE;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4210
		e1000_write_phy_reg(hw, PHY_1000T_CTRL, phy_ctrl);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4211
		if (!e1000_phy_setup_autoneg(hw) &&
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4212
		   !e1000_read_phy_reg(hw, PHY_CTRL, &phy_ctrl)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4213
			phy_ctrl |= (MII_CR_AUTO_NEG_EN |
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4214
				     MII_CR_RESTART_AUTO_NEG);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4215
			e1000_write_phy_reg(hw, PHY_CTRL, phy_ctrl);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4216
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4217
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4218
	/* Restart process after E1000_SMARTSPEED_MAX iterations */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4219
	if (adapter->smartspeed++ == E1000_SMARTSPEED_MAX)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4220
		adapter->smartspeed = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4221
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4222
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4223
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4224
 * e1000_ioctl -
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4225
 * @netdev:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4226
 * @ifreq:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4227
 * @cmd:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4228
 **/
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4229
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4230
static int e1000_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4231
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4232
	switch (cmd) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4233
	case SIOCGMIIPHY:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4234
	case SIOCGMIIREG:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4235
	case SIOCSMIIREG:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4236
		return e1000_mii_ioctl(netdev, ifr, cmd);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4237
	default:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4238
		return -EOPNOTSUPP;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4239
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4240
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4241
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4242
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4243
 * e1000_mii_ioctl -
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4244
 * @netdev:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4245
 * @ifreq:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4246
 * @cmd:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4247
 **/
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4248
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4249
static int e1000_mii_ioctl(struct net_device *netdev, struct ifreq *ifr,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4250
			   int cmd)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4251
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4252
	struct e1000_adapter *adapter = netdev_priv(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4253
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4254
	struct mii_ioctl_data *data = if_mii(ifr);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4255
	int retval;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4256
	u16 mii_reg;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4257
	u16 spddplx;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4258
	unsigned long flags;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4259
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4260
	if (hw->media_type != e1000_media_type_copper)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4261
		return -EOPNOTSUPP;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4262
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4263
	switch (cmd) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4264
	case SIOCGMIIPHY:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4265
		data->phy_id = hw->phy_addr;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4266
		break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4267
	case SIOCGMIIREG:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4268
		spin_lock_irqsave(&adapter->stats_lock, flags);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4269
		if (e1000_read_phy_reg(hw, data->reg_num & 0x1F,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4270
				   &data->val_out)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4271
			spin_unlock_irqrestore(&adapter->stats_lock, flags);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4272
			return -EIO;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4273
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4274
		spin_unlock_irqrestore(&adapter->stats_lock, flags);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4275
		break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4276
	case SIOCSMIIREG:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4277
		if (data->reg_num & ~(0x1F))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4278
			return -EFAULT;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4279
		mii_reg = data->val_in;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4280
		spin_lock_irqsave(&adapter->stats_lock, flags);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4281
		if (e1000_write_phy_reg(hw, data->reg_num,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4282
					mii_reg)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4283
			spin_unlock_irqrestore(&adapter->stats_lock, flags);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4284
			return -EIO;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4285
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4286
		spin_unlock_irqrestore(&adapter->stats_lock, flags);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4287
		if (hw->media_type == e1000_media_type_copper) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4288
			switch (data->reg_num) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4289
			case PHY_CTRL:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4290
				if (mii_reg & MII_CR_POWER_DOWN)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4291
					break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4292
				if (mii_reg & MII_CR_AUTO_NEG_EN) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4293
					hw->autoneg = 1;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4294
					hw->autoneg_advertised = 0x2F;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4295
				} else {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4296
					if (mii_reg & 0x40)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4297
						spddplx = SPEED_1000;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4298
					else if (mii_reg & 0x2000)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4299
						spddplx = SPEED_100;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4300
					else
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4301
						spddplx = SPEED_10;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4302
					spddplx += (mii_reg & 0x100)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4303
						   ? DUPLEX_FULL :
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4304
						   DUPLEX_HALF;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4305
					retval = e1000_set_spd_dplx(adapter,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4306
								    spddplx);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4307
					if (retval)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4308
						return retval;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4309
				}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4310
				if (netif_running(adapter->netdev))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4311
					e1000_reinit_locked(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4312
				else
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4313
					e1000_reset(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4314
				break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4315
			case M88E1000_PHY_SPEC_CTRL:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4316
			case M88E1000_EXT_PHY_SPEC_CTRL:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4317
				if (e1000_phy_reset(hw))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4318
					return -EIO;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4319
				break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4320
			}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4321
		} else {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4322
			switch (data->reg_num) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4323
			case PHY_CTRL:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4324
				if (mii_reg & MII_CR_POWER_DOWN)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4325
					break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4326
				if (netif_running(adapter->netdev))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4327
					e1000_reinit_locked(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4328
				else
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4329
					e1000_reset(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4330
				break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4331
			}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4332
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4333
		break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4334
	default:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4335
		return -EOPNOTSUPP;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4336
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4337
	return E1000_SUCCESS;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4338
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4339
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4340
void e1000_pci_set_mwi(struct e1000_hw *hw)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4341
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4342
	struct e1000_adapter *adapter = hw->back;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4343
	int ret_val = pci_set_mwi(adapter->pdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4344
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4345
	if (ret_val)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4346
		DPRINTK(PROBE, ERR, "Error in setting MWI\n");
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4347
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4348
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4349
void e1000_pci_clear_mwi(struct e1000_hw *hw)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4350
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4351
	struct e1000_adapter *adapter = hw->back;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4352
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4353
	pci_clear_mwi(adapter->pdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4354
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4355
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4356
int e1000_pcix_get_mmrbc(struct e1000_hw *hw)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4357
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4358
	struct e1000_adapter *adapter = hw->back;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4359
	return pcix_get_mmrbc(adapter->pdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4360
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4361
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4362
void e1000_pcix_set_mmrbc(struct e1000_hw *hw, int mmrbc)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4363
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4364
	struct e1000_adapter *adapter = hw->back;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4365
	pcix_set_mmrbc(adapter->pdev, mmrbc);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4366
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4367
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4368
void e1000_io_write(struct e1000_hw *hw, unsigned long port, u32 value)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4369
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4370
	outl(value, port);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4371
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4372
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4373
static void e1000_vlan_rx_register(struct net_device *netdev,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4374
				   struct vlan_group *grp)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4375
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4376
	struct e1000_adapter *adapter = netdev_priv(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4377
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4378
	u32 ctrl, rctl;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4379
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4380
	if (!test_bit(__E1000_DOWN, &adapter->flags))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4381
		e1000_irq_disable(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4382
	adapter->vlgrp = grp;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4383
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4384
	if (grp) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4385
		/* enable VLAN tag insert/strip */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4386
		ctrl = er32(CTRL);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4387
		ctrl |= E1000_CTRL_VME;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4388
		ew32(CTRL, ctrl);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4389
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4390
		/* enable VLAN receive filtering */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4391
		rctl = er32(RCTL);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4392
		rctl &= ~E1000_RCTL_CFIEN;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4393
		if (!(netdev->flags & IFF_PROMISC))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4394
			rctl |= E1000_RCTL_VFE;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4395
		ew32(RCTL, rctl);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4396
		e1000_update_mng_vlan(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4397
	} else {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4398
		/* disable VLAN tag insert/strip */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4399
		ctrl = er32(CTRL);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4400
		ctrl &= ~E1000_CTRL_VME;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4401
		ew32(CTRL, ctrl);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4402
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4403
		/* disable VLAN receive filtering */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4404
		rctl = er32(RCTL);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4405
		rctl &= ~E1000_RCTL_VFE;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4406
		ew32(RCTL, rctl);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4407
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4408
		if (adapter->mng_vlan_id != (u16)E1000_MNG_VLAN_NONE) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4409
			e1000_vlan_rx_kill_vid(netdev, adapter->mng_vlan_id);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4410
			adapter->mng_vlan_id = E1000_MNG_VLAN_NONE;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4411
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4412
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4413
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4414
	if (!test_bit(__E1000_DOWN, &adapter->flags))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4415
		e1000_irq_enable(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4416
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4417
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4418
static void e1000_vlan_rx_add_vid(struct net_device *netdev, u16 vid)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4419
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4420
	struct e1000_adapter *adapter = netdev_priv(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4421
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4422
	u32 vfta, index;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4423
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4424
	if ((hw->mng_cookie.status &
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4425
	     E1000_MNG_DHCP_COOKIE_STATUS_VLAN_SUPPORT) &&
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4426
	    (vid == adapter->mng_vlan_id))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4427
		return;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4428
	/* add VID to filter table */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4429
	index = (vid >> 5) & 0x7F;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4430
	vfta = E1000_READ_REG_ARRAY(hw, VFTA, index);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4431
	vfta |= (1 << (vid & 0x1F));
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4432
	e1000_write_vfta(hw, index, vfta);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4433
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4434
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4435
static void e1000_vlan_rx_kill_vid(struct net_device *netdev, u16 vid)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4436
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4437
	struct e1000_adapter *adapter = netdev_priv(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4438
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4439
	u32 vfta, index;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4440
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4441
	if (!test_bit(__E1000_DOWN, &adapter->flags))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4442
		e1000_irq_disable(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4443
	vlan_group_set_device(adapter->vlgrp, vid, NULL);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4444
	if (!test_bit(__E1000_DOWN, &adapter->flags))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4445
		e1000_irq_enable(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4446
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4447
	/* remove VID from filter table */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4448
	index = (vid >> 5) & 0x7F;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4449
	vfta = E1000_READ_REG_ARRAY(hw, VFTA, index);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4450
	vfta &= ~(1 << (vid & 0x1F));
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4451
	e1000_write_vfta(hw, index, vfta);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4452
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4453
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4454
static void e1000_restore_vlan(struct e1000_adapter *adapter)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4455
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4456
	e1000_vlan_rx_register(adapter->netdev, adapter->vlgrp);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4457
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4458
	if (adapter->vlgrp) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4459
		u16 vid;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4460
		for (vid = 0; vid < VLAN_GROUP_ARRAY_LEN; vid++) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4461
			if (!vlan_group_get_device(adapter->vlgrp, vid))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4462
				continue;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4463
			e1000_vlan_rx_add_vid(adapter->netdev, vid);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4464
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4465
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4466
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4467
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4468
int e1000_set_spd_dplx(struct e1000_adapter *adapter, u16 spddplx)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4469
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4470
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4471
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4472
	hw->autoneg = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4473
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4474
	/* Fiber NICs only allow 1000 gbps Full duplex */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4475
	if ((hw->media_type == e1000_media_type_fiber) &&
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4476
		spddplx != (SPEED_1000 + DUPLEX_FULL)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4477
		DPRINTK(PROBE, ERR, "Unsupported Speed/Duplex configuration\n");
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4478
		return -EINVAL;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4479
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4480
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4481
	switch (spddplx) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4482
	case SPEED_10 + DUPLEX_HALF:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4483
		hw->forced_speed_duplex = e1000_10_half;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4484
		break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4485
	case SPEED_10 + DUPLEX_FULL:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4486
		hw->forced_speed_duplex = e1000_10_full;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4487
		break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4488
	case SPEED_100 + DUPLEX_HALF:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4489
		hw->forced_speed_duplex = e1000_100_half;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4490
		break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4491
	case SPEED_100 + DUPLEX_FULL:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4492
		hw->forced_speed_duplex = e1000_100_full;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4493
		break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4494
	case SPEED_1000 + DUPLEX_FULL:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4495
		hw->autoneg = 1;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4496
		hw->autoneg_advertised = ADVERTISE_1000_FULL;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4497
		break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4498
	case SPEED_1000 + DUPLEX_HALF: /* not supported */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4499
	default:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4500
		DPRINTK(PROBE, ERR, "Unsupported Speed/Duplex configuration\n");
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4501
		return -EINVAL;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4502
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4503
	return 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4504
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4505
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4506
static int __e1000_shutdown(struct pci_dev *pdev, bool *enable_wake)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4507
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4508
	struct net_device *netdev = pci_get_drvdata(pdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4509
	struct e1000_adapter *adapter = netdev_priv(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4510
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4511
	u32 ctrl, ctrl_ext, rctl, status;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4512
	u32 wufc = adapter->wol;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4513
#ifdef CONFIG_PM
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4514
	int retval = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4515
#endif
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4516
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4517
	netif_device_detach(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4518
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4519
	if (netif_running(netdev)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4520
		WARN_ON(test_bit(__E1000_RESETTING, &adapter->flags));
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4521
		e1000_down(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4522
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4523
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4524
#ifdef CONFIG_PM
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4525
	retval = pci_save_state(pdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4526
	if (retval)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4527
		return retval;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4528
#endif
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4529
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4530
	status = er32(STATUS);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4531
	if (status & E1000_STATUS_LU)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4532
		wufc &= ~E1000_WUFC_LNKC;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4533
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4534
	if (wufc) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4535
		e1000_setup_rctl(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4536
		e1000_set_rx_mode(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4537
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4538
		/* turn on all-multi mode if wake on multicast is enabled */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4539
		if (wufc & E1000_WUFC_MC) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4540
			rctl = er32(RCTL);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4541
			rctl |= E1000_RCTL_MPE;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4542
			ew32(RCTL, rctl);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4543
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4544
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4545
		if (hw->mac_type >= e1000_82540) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4546
			ctrl = er32(CTRL);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4547
			/* advertise wake from D3Cold */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4548
			#define E1000_CTRL_ADVD3WUC 0x00100000
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4549
			/* phy power management enable */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4550
			#define E1000_CTRL_EN_PHY_PWR_MGMT 0x00200000
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4551
			ctrl |= E1000_CTRL_ADVD3WUC |
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4552
				E1000_CTRL_EN_PHY_PWR_MGMT;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4553
			ew32(CTRL, ctrl);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4554
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4555
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4556
		if (hw->media_type == e1000_media_type_fiber ||
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4557
		    hw->media_type == e1000_media_type_internal_serdes) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4558
			/* keep the laser running in D3 */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4559
			ctrl_ext = er32(CTRL_EXT);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4560
			ctrl_ext |= E1000_CTRL_EXT_SDP7_DATA;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4561
			ew32(CTRL_EXT, ctrl_ext);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4562
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4563
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4564
		ew32(WUC, E1000_WUC_PME_EN);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4565
		ew32(WUFC, wufc);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4566
	} else {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4567
		ew32(WUC, 0);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4568
		ew32(WUFC, 0);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4569
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4570
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4571
	e1000_release_manageability(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4572
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4573
	*enable_wake = !!wufc;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4574
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4575
	/* make sure adapter isn't asleep if manageability is enabled */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4576
	if (adapter->en_mng_pt)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4577
		*enable_wake = true;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4578
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4579
	if (netif_running(netdev))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4580
		e1000_free_irq(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4581
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4582
	pci_disable_device(pdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4583
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4584
	return 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4585
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4586
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4587
#ifdef CONFIG_PM
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4588
static int e1000_suspend(struct pci_dev *pdev, pm_message_t state)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4589
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4590
	int retval;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4591
	bool wake;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4592
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4593
	retval = __e1000_shutdown(pdev, &wake);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4594
	if (retval)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4595
		return retval;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4596
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4597
	if (wake) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4598
		pci_prepare_to_sleep(pdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4599
	} else {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4600
		pci_wake_from_d3(pdev, false);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4601
		pci_set_power_state(pdev, PCI_D3hot);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4602
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4603
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4604
	return 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4605
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4606
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4607
static int e1000_resume(struct pci_dev *pdev)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4608
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4609
	struct net_device *netdev = pci_get_drvdata(pdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4610
	struct e1000_adapter *adapter = netdev_priv(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4611
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4612
	u32 err;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4613
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4614
	pci_set_power_state(pdev, PCI_D0);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4615
	pci_restore_state(pdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4616
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4617
	if (adapter->need_ioport)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4618
		err = pci_enable_device(pdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4619
	else
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4620
		err = pci_enable_device_mem(pdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4621
	if (err) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4622
		printk(KERN_ERR "e1000: Cannot enable PCI device from suspend\n");
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4623
		return err;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4624
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4625
	pci_set_master(pdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4626
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4627
	pci_enable_wake(pdev, PCI_D3hot, 0);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4628
	pci_enable_wake(pdev, PCI_D3cold, 0);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4629
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4630
	if (netif_running(netdev)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4631
		err = e1000_request_irq(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4632
		if (err)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4633
			return err;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4634
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4635
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4636
	e1000_power_up_phy(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4637
	e1000_reset(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4638
	ew32(WUS, ~0);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4639
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4640
	e1000_init_manageability(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4641
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4642
	if (netif_running(netdev))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4643
		e1000_up(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4644
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4645
	netif_device_attach(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4646
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4647
	return 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4648
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4649
#endif
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4650
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4651
static void e1000_shutdown(struct pci_dev *pdev)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4652
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4653
	bool wake;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4654
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4655
	__e1000_shutdown(pdev, &wake);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4656
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4657
	if (system_state == SYSTEM_POWER_OFF) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4658
		pci_wake_from_d3(pdev, wake);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4659
		pci_set_power_state(pdev, PCI_D3hot);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4660
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4661
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4662
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4663
#ifdef CONFIG_NET_POLL_CONTROLLER
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4664
/*
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4665
 * Polling 'interrupt' - used by things like netconsole to send skbs
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4666
 * without having to re-enable interrupts. It's not called while
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4667
 * the interrupt routine is executing.
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4668
 */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4669
static void e1000_netpoll(struct net_device *netdev)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4670
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4671
	struct e1000_adapter *adapter = netdev_priv(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4672
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4673
	disable_irq(adapter->pdev->irq);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4674
	e1000_intr(adapter->pdev->irq, netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4675
	enable_irq(adapter->pdev->irq);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4676
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4677
#endif
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4678
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4679
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4680
 * e1000_io_error_detected - called when PCI error is detected
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4681
 * @pdev: Pointer to PCI device
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4682
 * @state: The current pci connection state
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4683
 *
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4684
 * This function is called after a PCI bus error affecting
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4685
 * this device has been detected.
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4686
 */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4687
static pci_ers_result_t e1000_io_error_detected(struct pci_dev *pdev,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4688
						pci_channel_state_t state)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4689
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4690
	struct net_device *netdev = pci_get_drvdata(pdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4691
	struct e1000_adapter *adapter = netdev_priv(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4692
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4693
	netif_device_detach(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4694
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4695
	if (state == pci_channel_io_perm_failure)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4696
		return PCI_ERS_RESULT_DISCONNECT;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4697
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4698
	if (netif_running(netdev))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4699
		e1000_down(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4700
	pci_disable_device(pdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4701
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4702
	/* Request a slot slot reset. */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4703
	return PCI_ERS_RESULT_NEED_RESET;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4704
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4705
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4706
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4707
 * e1000_io_slot_reset - called after the pci bus has been reset.
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4708
 * @pdev: Pointer to PCI device
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4709
 *
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4710
 * Restart the card from scratch, as if from a cold-boot. Implementation
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4711
 * resembles the first-half of the e1000_resume routine.
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4712
 */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4713
static pci_ers_result_t e1000_io_slot_reset(struct pci_dev *pdev)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4714
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4715
	struct net_device *netdev = pci_get_drvdata(pdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4716
	struct e1000_adapter *adapter = netdev_priv(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4717
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4718
	int err;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4719
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4720
	if (adapter->need_ioport)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4721
		err = pci_enable_device(pdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4722
	else
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4723
		err = pci_enable_device_mem(pdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4724
	if (err) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4725
		printk(KERN_ERR "e1000: Cannot re-enable PCI device after reset.\n");
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4726
		return PCI_ERS_RESULT_DISCONNECT;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4727
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4728
	pci_set_master(pdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4729
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4730
	pci_enable_wake(pdev, PCI_D3hot, 0);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4731
	pci_enable_wake(pdev, PCI_D3cold, 0);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4732
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4733
	e1000_reset(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4734
	ew32(WUS, ~0);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4735
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4736
	return PCI_ERS_RESULT_RECOVERED;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4737
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4738
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4739
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4740
 * e1000_io_resume - called when traffic can start flowing again.
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4741
 * @pdev: Pointer to PCI device
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4742
 *
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4743
 * This callback is called when the error recovery driver tells us that
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4744
 * its OK to resume normal operation. Implementation resembles the
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4745
 * second-half of the e1000_resume routine.
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4746
 */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4747
static void e1000_io_resume(struct pci_dev *pdev)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4748
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4749
	struct net_device *netdev = pci_get_drvdata(pdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4750
	struct e1000_adapter *adapter = netdev_priv(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4751
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4752
	e1000_init_manageability(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4753
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4754
	if (netif_running(netdev)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4755
		if (e1000_up(adapter)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4756
			printk("e1000: can't bring device back up after reset\n");
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4757
			return;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4758
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4759
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4760
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4761
	netif_device_attach(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4762
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4763
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4764
/* e1000_main.c */