devices/e1000/e1000_main-2.6.33-ethercat.c
author Knud Baastrup <kba@deif.com>
Tue, 14 Apr 2015 13:12:24 -0400
changeset 2629 a2701af27fde
parent 2589 2b9c78543663
permissions -rw-r--r--
Internal SDO requests now synchronized with external requests.
Internal SDO requests are managed by master FSM and can conflict with
external requests managed by slave FSM. The internal SDO requests
includes SDO requests created by an application and external request are
typical created by EtherCAT Tool for SDO upload/download or a directory
fetch initiated with ethercat sdos command. The conflict will cause a
FPWR from an external request to be overwritten by a FPWR from an
internal SDO request (or oppersite) in the same "train" of datagrams.
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
  vim: noexpandtab
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
*******************************************************************************/
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    30
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    31
#include "e1000-2.6.33-ethercat.h"
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    32
#include <net/ip6_checksum.h>
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    33
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    34
char e1000_driver_name[] = "ec_e1000";
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    35
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
    36
#define DRV_VERSION "7.3.21-k5-NAPI"
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    37
const char e1000_driver_version[] = DRV_VERSION;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    38
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
    39
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    40
/* e1000_pci_tbl - PCI Device ID Table
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
 * Last entry must be all 0s
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    43
 *
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    44
 * Macro expands to...
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    45
 *   {PCI_DEVICE(PCI_VENDOR_ID_INTEL, device_id)}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    46
 */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    47
static struct pci_device_id e1000_pci_tbl[] = {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    48
	INTEL_E1000_ETHERNET_DEVICE(0x1000),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    49
	INTEL_E1000_ETHERNET_DEVICE(0x1001),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    50
	INTEL_E1000_ETHERNET_DEVICE(0x1004),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    51
	INTEL_E1000_ETHERNET_DEVICE(0x1008),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    52
	INTEL_E1000_ETHERNET_DEVICE(0x1009),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    53
	INTEL_E1000_ETHERNET_DEVICE(0x100C),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    54
	INTEL_E1000_ETHERNET_DEVICE(0x100D),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    55
	INTEL_E1000_ETHERNET_DEVICE(0x100E),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    56
	INTEL_E1000_ETHERNET_DEVICE(0x100F),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    57
	INTEL_E1000_ETHERNET_DEVICE(0x1010),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    58
	INTEL_E1000_ETHERNET_DEVICE(0x1011),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    59
	INTEL_E1000_ETHERNET_DEVICE(0x1012),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    60
	INTEL_E1000_ETHERNET_DEVICE(0x1013),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    61
	INTEL_E1000_ETHERNET_DEVICE(0x1014),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    62
	INTEL_E1000_ETHERNET_DEVICE(0x1015),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    63
	INTEL_E1000_ETHERNET_DEVICE(0x1016),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    64
	INTEL_E1000_ETHERNET_DEVICE(0x1017),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    65
	INTEL_E1000_ETHERNET_DEVICE(0x1018),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    66
	INTEL_E1000_ETHERNET_DEVICE(0x1019),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    67
	INTEL_E1000_ETHERNET_DEVICE(0x101A),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    68
	INTEL_E1000_ETHERNET_DEVICE(0x101D),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    69
	INTEL_E1000_ETHERNET_DEVICE(0x101E),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    70
	INTEL_E1000_ETHERNET_DEVICE(0x1026),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    71
	INTEL_E1000_ETHERNET_DEVICE(0x1027),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    72
	INTEL_E1000_ETHERNET_DEVICE(0x1028),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    73
	INTEL_E1000_ETHERNET_DEVICE(0x1075),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    74
	INTEL_E1000_ETHERNET_DEVICE(0x1076),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    75
	INTEL_E1000_ETHERNET_DEVICE(0x1077),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    76
	INTEL_E1000_ETHERNET_DEVICE(0x1078),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    77
	INTEL_E1000_ETHERNET_DEVICE(0x1079),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    78
	INTEL_E1000_ETHERNET_DEVICE(0x107A),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    79
	INTEL_E1000_ETHERNET_DEVICE(0x107B),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    80
	INTEL_E1000_ETHERNET_DEVICE(0x107C),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    81
	INTEL_E1000_ETHERNET_DEVICE(0x108A),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    82
	INTEL_E1000_ETHERNET_DEVICE(0x1099),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    83
	INTEL_E1000_ETHERNET_DEVICE(0x10B5),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    84
	/* required last entry */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    85
	{0,}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    86
};
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
// do not auto-load driver
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    89
// MODULE_DEVICE_TABLE(pci, e1000_pci_tbl);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    90
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    91
int e1000_up(struct e1000_adapter *adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    92
void e1000_down(struct e1000_adapter *adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    93
void e1000_reinit_locked(struct e1000_adapter *adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    94
void e1000_reset(struct e1000_adapter *adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
    95
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
    96
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
    97
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
    98
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
    99
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
   100
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
   101
                             struct e1000_tx_ring *txdr);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   102
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
   103
                             struct e1000_rx_ring *rxdr);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   104
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
   105
                             struct e1000_tx_ring *tx_ring);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   106
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
   107
                             struct e1000_rx_ring *rx_ring);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   108
void e1000_update_stats(struct e1000_adapter *adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   109
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   110
static int e1000_init_module(void);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   111
static void e1000_exit_module(void);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   112
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
   113
static void __devexit e1000_remove(struct pci_dev *pdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   114
static int e1000_alloc_queues(struct e1000_adapter *adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   115
static int e1000_sw_init(struct e1000_adapter *adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   116
static int e1000_open(struct net_device *netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   117
static int e1000_close(struct net_device *netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   118
static void e1000_configure_tx(struct e1000_adapter *adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   119
static void e1000_configure_rx(struct e1000_adapter *adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   120
static void e1000_setup_rctl(struct e1000_adapter *adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   121
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
   122
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
   123
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
   124
                                struct e1000_tx_ring *tx_ring);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   125
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
   126
                                struct e1000_rx_ring *rx_ring);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   127
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
   128
static void e1000_update_phy_info(unsigned long data);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   129
static void e1000_watchdog(unsigned long data);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   130
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
   131
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
   132
				    struct net_device *netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   133
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
   134
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
   135
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
   136
void ec_poll(struct net_device *);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   137
static irqreturn_t e1000_intr(int irq, void *data);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   138
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
   139
			       struct e1000_tx_ring *tx_ring);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   140
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
   141
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
   142
			       struct e1000_rx_ring *rx_ring,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   143
			       int *work_done, int work_to_do);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   144
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
   145
				     struct e1000_rx_ring *rx_ring,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   146
				     int *work_done, int work_to_do);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   147
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
   148
				   struct e1000_rx_ring *rx_ring,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   149
				   int cleaned_count);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   150
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
   151
					 struct e1000_rx_ring *rx_ring,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   152
					 int cleaned_count);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   153
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
   154
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
   155
			   int cmd);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   156
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
   157
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
   158
static void e1000_tx_timeout(struct net_device *dev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   159
static void e1000_reset_task(struct work_struct *work);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   160
static void e1000_smartspeed(struct e1000_adapter *adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   161
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
   162
                                       struct sk_buff *skb);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   163
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   164
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
   165
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
   166
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
   167
static void e1000_restore_vlan(struct e1000_adapter *adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   168
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   169
#ifdef CONFIG_PM
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   170
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
   171
static int e1000_resume(struct pci_dev *pdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   172
#endif
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   173
static void e1000_shutdown(struct pci_dev *pdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   174
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   175
#ifdef CONFIG_NET_POLL_CONTROLLER
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   176
/* for netdump / net console */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   177
static void e1000_netpoll (struct net_device *netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   178
#endif
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   179
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   180
#define COPYBREAK_DEFAULT 256
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   181
static unsigned int copybreak __read_mostly = COPYBREAK_DEFAULT;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   182
module_param(copybreak, uint, 0644);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   183
MODULE_PARM_DESC(copybreak,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   184
	"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
   185
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   186
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
   187
                     pci_channel_state_t state);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   188
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
   189
static void e1000_io_resume(struct pci_dev *pdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   190
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   191
static struct pci_error_handlers e1000_err_handler = {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   192
	.error_detected = e1000_io_error_detected,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   193
	.slot_reset = e1000_io_slot_reset,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   194
	.resume = e1000_io_resume,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   195
};
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   196
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   197
static struct pci_driver e1000_driver = {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   198
	.name     = e1000_driver_name,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   199
	.id_table = e1000_pci_tbl,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   200
	.probe    = e1000_probe,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   201
	.remove   = __devexit_p(e1000_remove),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   202
#ifdef CONFIG_PM
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   203
	/* Power Managment Hooks */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   204
	.suspend  = e1000_suspend,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   205
	.resume   = e1000_resume,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   206
#endif
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   207
	.shutdown = e1000_shutdown,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   208
	.err_handler = &e1000_err_handler
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   209
};
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   210
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   211
MODULE_AUTHOR("Florian Pose <fp@igh-essen.com>");
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   212
MODULE_DESCRIPTION("EtherCAT-capable Intel(R) PRO/1000 Network Driver");
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   213
MODULE_LICENSE("GPL");
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   214
MODULE_VERSION(DRV_VERSION);
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
static int debug = NETIF_MSG_DRV | NETIF_MSG_PROBE;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   217
module_param(debug, int, 0);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   218
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
   219
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   220
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   221
 * e1000_init_module - Driver Registration Routine
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
 * 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
   224
 * 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
   225
 **/
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   226
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   227
static int __init e1000_init_module(void)
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
	int ret;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   230
	printk(KERN_INFO "%s - version %s\n",
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   231
	       e1000_driver_string, e1000_driver_version);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   232
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   233
	printk(KERN_INFO "%s\n", e1000_copyright);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   234
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   235
	ret = pci_register_driver(&e1000_driver);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   236
	if (copybreak != COPYBREAK_DEFAULT) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   237
		if (copybreak == 0)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   238
			printk(KERN_INFO "e1000: copybreak disabled\n");
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   239
		else
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   240
			printk(KERN_INFO "e1000: copybreak enabled for "
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   241
			       "packets <= %u bytes\n", copybreak);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   242
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   243
	return ret;
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
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   246
module_init(e1000_init_module);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   247
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   248
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   249
 * e1000_exit_module - Driver Exit Cleanup Routine
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
 * 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
   252
 * from memory.
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   253
 **/
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
static void __exit e1000_exit_module(void)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   256
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   257
	pci_unregister_driver(&e1000_driver);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   258
}
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
module_exit(e1000_exit_module);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   261
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   262
static int e1000_request_irq(struct e1000_adapter *adapter)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   263
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   264
	struct net_device *netdev = adapter->netdev;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   265
	irq_handler_t handler = e1000_intr;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   266
	int irq_flags = IRQF_SHARED;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   267
	int err;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   268
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   269
	if (adapter->ecdev)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   270
		return 0;
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
	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
   273
	                  netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   274
	if (err) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   275
		DPRINTK(PROBE, ERR,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   276
		        "Unable to allocate interrupt Error: %d\n", err);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   277
	}
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
	return err;
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
static void e1000_free_irq(struct e1000_adapter *adapter)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   283
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   284
	struct net_device *netdev = adapter->netdev;
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
	if (adapter->ecdev)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   287
		return;
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
	free_irq(adapter->pdev->irq, netdev);
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
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   292
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   293
 * 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
   294
 * @adapter: board private structure
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
static void e1000_irq_disable(struct e1000_adapter *adapter)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   298
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   299
	struct e1000_hw *hw = &adapter->hw;
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
	if (adapter->ecdev)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   302
		return;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   303
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   304
	ew32(IMC, ~0);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   305
	E1000_WRITE_FLUSH();
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   306
	synchronize_irq(adapter->pdev->irq);
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
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   310
 * e1000_irq_enable - Enable default interrupt generation settings
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   311
 * @adapter: board private structure
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   312
 **/
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   313
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   314
static void e1000_irq_enable(struct e1000_adapter *adapter)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   315
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   316
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   317
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   318
	if (adapter->ecdev)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   319
		return;
2589
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2209
diff changeset
   320
1992
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   321
	ew32(IMS, IMS_ENABLE_MASK);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   322
	E1000_WRITE_FLUSH();
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
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   325
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
   326
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   327
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   328
	struct net_device *netdev = adapter->netdev;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   329
	u16 vid = hw->mng_cookie.vlan_id;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   330
	u16 old_vid = adapter->mng_vlan_id;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   331
	if (adapter->vlgrp) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   332
		if (!vlan_group_get_device(adapter->vlgrp, vid)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   333
			if (hw->mng_cookie.status &
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   334
				E1000_MNG_DHCP_COOKIE_STATUS_VLAN_SUPPORT) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   335
				e1000_vlan_rx_add_vid(netdev, vid);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   336
				adapter->mng_vlan_id = vid;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   337
			} else
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   338
				adapter->mng_vlan_id = E1000_MNG_VLAN_NONE;
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
			if ((old_vid != (u16)E1000_MNG_VLAN_NONE) &&
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   341
					(vid != old_vid) &&
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   342
			    !vlan_group_get_device(adapter->vlgrp, old_vid))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   343
				e1000_vlan_rx_kill_vid(netdev, old_vid);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   344
		} else
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   345
			adapter->mng_vlan_id = vid;
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
}
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
static void e1000_init_manageability(struct e1000_adapter *adapter)
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
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   352
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   353
	if (adapter->en_mng_pt) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   354
		u32 manc = er32(MANC);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   355
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   356
		/* disable hardware interception of ARP */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   357
		manc &= ~(E1000_MANC_ARP_EN);
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
		ew32(MANC, manc);
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
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   363
static void e1000_release_manageability(struct e1000_adapter *adapter)
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
	struct e1000_hw *hw = &adapter->hw;
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
	if (adapter->en_mng_pt) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   368
		u32 manc = er32(MANC);
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
		/* re-enable hardware interception of ARP */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   371
		manc |= E1000_MANC_ARP_EN;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   372
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   373
		ew32(MANC, manc);
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
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   376
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   377
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   378
 * e1000_configure - configure the hardware for RX and TX
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   379
 * @adapter = private board structure
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   380
 **/
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   381
static void e1000_configure(struct e1000_adapter *adapter)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   382
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   383
	struct net_device *netdev = adapter->netdev;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   384
	int i;
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
	e1000_set_rx_mode(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   387
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   388
	e1000_restore_vlan(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   389
	e1000_init_manageability(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   390
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   391
	e1000_configure_tx(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   392
	e1000_setup_rctl(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   393
	e1000_configure_rx(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   394
	/* call E1000_DESC_UNUSED which always leaves
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   395
	 * at least 1 descriptor unused to make sure
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   396
	 * next_to_use != next_to_clean */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   397
	for (i = 0; i < adapter->num_rx_queues; i++) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   398
		struct e1000_rx_ring *ring = &adapter->rx_ring[i];
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   399
		if (adapter->ecdev) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   400
			/* fill rx ring completely! */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   401
			adapter->alloc_rx_buf(adapter, ring, ring->count);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   402
		} else {
2206
983aa34ca11d Minor spacing changes.
Florian Pose <fp@igh-essen.com>
parents: 2163
diff changeset
   403
			/* this one leaves the last ring element unallocated! */
1992
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   404
			adapter->alloc_rx_buf(adapter, ring,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   405
					E1000_DESC_UNUSED(ring));
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   406
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   407
	}
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
	adapter->tx_queue_len = netdev->tx_queue_len;
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
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   412
int e1000_up(struct e1000_adapter *adapter)
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
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   415
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   416
	/* 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
   417
	e1000_configure(adapter);
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
	clear_bit(__E1000_DOWN, &adapter->flags);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   420
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   421
	if (!adapter->ecdev) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   422
		napi_enable(&adapter->napi);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   423
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   424
		e1000_irq_enable(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   425
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   426
		netif_wake_queue(adapter->netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   427
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   428
		/* fire a link change interrupt to start the watchdog */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   429
		ew32(ICS, E1000_ICS_LSC);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   430
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   431
	return 0;
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
 * 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
   436
 * @adapter: address of board private structure
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   437
 *
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   438
 * 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
   439
 * 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
   440
 * *** 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
   441
 *
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   442
 **/
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   443
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   444
void e1000_power_up_phy(struct e1000_adapter *adapter)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   445
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   446
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   447
	u16 mii_reg = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   448
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   449
	/* 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
   450
	if (hw->media_type == e1000_media_type_copper) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   451
		/* according to the manual, the phy will retain its
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   452
		 * settings across a power-down/up cycle */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   453
		e1000_read_phy_reg(hw, PHY_CTRL, &mii_reg);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   454
		mii_reg &= ~MII_CR_POWER_DOWN;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   455
		e1000_write_phy_reg(hw, PHY_CTRL, mii_reg);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   456
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   457
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   458
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   459
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
   460
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   461
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   462
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   463
	/* 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
   464
	 * 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
   465
	 * (a) WoL is enabled
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   466
	 * (b) AMT is active
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   467
	 * (c) SoL/IDER session is active */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   468
	if (!adapter->wol && hw->mac_type >= e1000_82540 &&
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   469
	   hw->media_type == e1000_media_type_copper) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   470
		u16 mii_reg = 0;
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
		switch (hw->mac_type) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   473
		case e1000_82540:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   474
		case e1000_82545:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   475
		case e1000_82545_rev_3:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   476
		case e1000_82546:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   477
		case e1000_82546_rev_3:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   478
		case e1000_82541:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   479
		case e1000_82541_rev_2:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   480
		case e1000_82547:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   481
		case e1000_82547_rev_2:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   482
			if (er32(MANC) & E1000_MANC_SMBUS_EN)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   483
				goto out;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   484
			break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   485
		default:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   486
			goto out;
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
		e1000_read_phy_reg(hw, PHY_CTRL, &mii_reg);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   489
		mii_reg |= MII_CR_POWER_DOWN;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   490
		e1000_write_phy_reg(hw, PHY_CTRL, mii_reg);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   491
		mdelay(1);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   492
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   493
out:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   494
	return;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   495
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   496
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   497
void e1000_down(struct e1000_adapter *adapter)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   498
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   499
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   500
	struct net_device *netdev = adapter->netdev;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   501
	u32 rctl, tctl;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   502
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   503
	/* 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
   504
	 * reschedule our watchdog timer */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   505
	set_bit(__E1000_DOWN, &adapter->flags);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   506
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   507
	/* disable receives in the hardware */	
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   508
	rctl = er32(RCTL);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   509
	ew32(RCTL, rctl & ~E1000_RCTL_EN);
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
	if (!adapter->ecdev) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   512
		/* flush and sleep below */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   513
		netif_tx_disable(netdev);
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
	/* disable transmits in the hardware */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   517
	tctl = er32(TCTL);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   518
	tctl &= ~E1000_TCTL_EN;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   519
	ew32(TCTL, tctl);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   520
	/* flush both disables and wait for them to finish */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   521
	E1000_WRITE_FLUSH();
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   522
	msleep(10);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   523
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   524
	if (!adapter->ecdev) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   525
		napi_disable(&adapter->napi);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   526
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   527
		e1000_irq_disable(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   528
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   529
		del_timer_sync(&adapter->tx_fifo_stall_timer);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   530
		del_timer_sync(&adapter->watchdog_timer);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   531
		del_timer_sync(&adapter->phy_info_timer);
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
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   534
	netdev->tx_queue_len = adapter->tx_queue_len;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   535
	adapter->link_speed = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   536
	adapter->link_duplex = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   537
	if (!adapter->ecdev) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   538
		netif_carrier_off(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   539
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   540
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   541
	e1000_reset(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   542
	e1000_clean_all_tx_rings(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   543
	e1000_clean_all_rx_rings(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   544
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   545
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   546
void e1000_reinit_locked(struct e1000_adapter *adapter)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   547
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   548
	WARN_ON(in_interrupt());
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   549
	while (test_and_set_bit(__E1000_RESETTING, &adapter->flags))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   550
		msleep(1);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   551
	e1000_down(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   552
	e1000_up(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   553
	clear_bit(__E1000_RESETTING, &adapter->flags);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   554
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   555
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   556
void e1000_reset(struct e1000_adapter *adapter)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   557
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   558
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   559
	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
   560
	bool legacy_pba_adjust = false;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   561
	u16 hwm;
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
	/* Repartition Pba for greater than 9k mtu
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   564
	 * To take effect CTRL.RST is required.
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   565
	 */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   566
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   567
	switch (hw->mac_type) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   568
	case e1000_82542_rev2_0:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   569
	case e1000_82542_rev2_1:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   570
	case e1000_82543:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   571
	case e1000_82544:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   572
	case e1000_82540:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   573
	case e1000_82541:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   574
	case e1000_82541_rev_2:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   575
		legacy_pba_adjust = true;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   576
		pba = E1000_PBA_48K;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   577
		break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   578
	case e1000_82545:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   579
	case e1000_82545_rev_3:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   580
	case e1000_82546:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   581
	case e1000_82546_rev_3:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   582
		pba = E1000_PBA_48K;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   583
		break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   584
	case e1000_82547:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   585
	case e1000_82547_rev_2:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   586
		legacy_pba_adjust = true;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   587
		pba = E1000_PBA_30K;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   588
		break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   589
	case e1000_undefined:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   590
	case e1000_num_macs:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   591
		break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   592
	}
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
	if (legacy_pba_adjust) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   595
		if (hw->max_frame_size > E1000_RXBUFFER_8192)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   596
			pba -= 8; /* allocate more FIFO for Tx */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   597
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   598
		if (hw->mac_type == e1000_82547) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   599
			adapter->tx_fifo_head = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   600
			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
   601
			adapter->tx_fifo_size =
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   602
				(E1000_PBA_40K - pba) << E1000_PBA_BYTES_SHIFT;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   603
			atomic_set(&adapter->tx_fifo_stall, 0);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   604
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   605
	} 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
   606
		/* adjust PBA for jumbo frames */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   607
		ew32(PBA, pba);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   608
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   609
		/* 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
   610
		 * large enough to accommodate two full transmit packets,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   611
		 * 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
   612
		 * 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
   613
		 * 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
   614
		 * expressed in KB. */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   615
		pba = er32(PBA);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   616
		/* 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
   617
		tx_space = pba >> 16;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   618
		/* 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
   619
		pba &= 0xffff;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   620
		/*
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   621
		 * 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
   622
		 * 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
   623
		 */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   624
		min_tx_space = (hw->max_frame_size +
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   625
		                sizeof(struct e1000_tx_desc) -
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   626
		                ETH_FCS_LEN) * 2;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   627
		min_tx_space = ALIGN(min_tx_space, 1024);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   628
		min_tx_space >>= 10;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   629
		/* software strips receive CRC, so leave room for it */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   630
		min_rx_space = hw->max_frame_size;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   631
		min_rx_space = ALIGN(min_rx_space, 1024);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   632
		min_rx_space >>= 10;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   633
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   634
		/* 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
   635
		 * 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
   636
		 * allocation, take space away from current Rx allocation */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   637
		if (tx_space < min_tx_space &&
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   638
		    ((min_tx_space - tx_space) < pba)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   639
			pba = pba - (min_tx_space - tx_space);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   640
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   641
			/* PCI/PCIx hardware has PBA alignment constraints */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   642
			switch (hw->mac_type) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   643
			case e1000_82545 ... e1000_82546_rev_3:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   644
				pba &= ~(E1000_PBA_8K - 1);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   645
				break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   646
			default:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   647
				break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   648
			}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   649
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   650
			/* 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
   651
			 * adjustment or use Early Receive if available */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   652
			if (pba < min_rx_space)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   653
				pba = min_rx_space;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   654
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   655
	}
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
	ew32(PBA, pba);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   658
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   659
	/*
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   660
	 * flow control settings:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   661
	 * 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
   662
	 * (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
   663
	 * Set it to the lower of:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   664
	 * - 90% of the Rx FIFO size, and
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   665
	 * - 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
   666
	 *   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
   667
	 * - the full Rx FIFO size minus one full frame
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
	hwm = min(((pba << 10) * 9 / 10),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   670
		  ((pba << 10) - hw->max_frame_size));
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
	hw->fc_high_water = hwm & 0xFFF8;	/* 8-byte granularity */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   673
	hw->fc_low_water = hw->fc_high_water - 8;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   674
	hw->fc_pause_time = E1000_FC_PAUSE_TIME;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   675
	hw->fc_send_xon = 1;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   676
	hw->fc = hw->original_fc;
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
	/* Allow time for pending master requests to run */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   679
	e1000_reset_hw(hw);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   680
	if (hw->mac_type >= e1000_82544)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   681
		ew32(WUC, 0);
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
	if (e1000_init_hw(hw))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   684
		DPRINTK(PROBE, ERR, "Hardware Error\n");
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   685
	e1000_update_mng_vlan(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   686
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   687
	/* if (adapter->hwflags & HWFLAGS_PHY_PWR_BIT) { */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   688
	if (hw->mac_type >= e1000_82544 &&
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   689
	    hw->autoneg == 1 &&
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   690
	    hw->autoneg_advertised == ADVERTISE_1000_FULL) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   691
		u32 ctrl = er32(CTRL);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   692
		/* 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
   693
		 * which if enabled will attempt negotiation to 100Mb, which
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   694
		 * 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
   695
		ctrl &= ~E1000_CTRL_SWDPIN3;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   696
		ew32(CTRL, ctrl);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   697
	}
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
	/* 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
   700
	ew32(VET, ETHERNET_IEEE_VLAN_TYPE);
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
	e1000_reset_adaptive(hw);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   703
	e1000_phy_get_info(hw, &adapter->phy_info);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   704
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   705
	e1000_release_manageability(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   706
}
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
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   709
 *  Dump the eeprom for users having checksum issues
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   710
 **/
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   711
static void e1000_dump_eeprom(struct e1000_adapter *adapter)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   712
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   713
	struct net_device *netdev = adapter->netdev;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   714
	struct ethtool_eeprom eeprom;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   715
	const struct ethtool_ops *ops = netdev->ethtool_ops;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   716
	u8 *data;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   717
	int i;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   718
	u16 csum_old, csum_new = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   719
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   720
	eeprom.len = ops->get_eeprom_len(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   721
	eeprom.offset = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   722
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   723
	data = kmalloc(eeprom.len, GFP_KERNEL);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   724
	if (!data) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   725
		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
   726
		       " data\n");
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   727
		return;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   728
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   729
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   730
	ops->get_eeprom(netdev, &eeprom, data);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   731
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   732
	csum_old = (data[EEPROM_CHECKSUM_REG * 2]) +
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   733
		   (data[EEPROM_CHECKSUM_REG * 2 + 1] << 8);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   734
	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
   735
		csum_new += data[i] + (data[i + 1] << 8);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   736
	csum_new = EEPROM_SUM - csum_new;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   737
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   738
	printk(KERN_ERR "/*********************/\n");
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   739
	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
   740
	printk(KERN_ERR "Calculated              : 0x%04x\n", csum_new);
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
	printk(KERN_ERR "Offset    Values\n");
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   743
	printk(KERN_ERR "========  ======\n");
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   744
	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
   745
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   746
	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
   747
	       "provider.\n");
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   748
	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
   749
	       "happened to your hardware or\n");
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   750
	printk(KERN_ERR "EEPROM image. Ignoring this "
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   751
	       "problem could result in further problems,\n");
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   752
	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
   753
	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
   754
	       "which is invalid\n");
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   755
	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
   756
	       "address manually before continuing\n");
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   757
	printk(KERN_ERR "to enable this network device.\n");
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   758
	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
   759
	       "to your hardware vendor\n");
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   760
	printk(KERN_ERR "or Intel Customer Support.\n");
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   761
	printk(KERN_ERR "/*********************/\n");
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   762
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   763
	kfree(data);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   764
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   765
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   766
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   767
 * 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
   768
 * @pdev: PCI device information struct
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
 * Return true if an adapter needs ioport resources
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 int e1000_is_need_ioport(struct pci_dev *pdev)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   773
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   774
	switch (pdev->device) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   775
	case E1000_DEV_ID_82540EM:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   776
	case E1000_DEV_ID_82540EM_LOM:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   777
	case E1000_DEV_ID_82540EP:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   778
	case E1000_DEV_ID_82540EP_LOM:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   779
	case E1000_DEV_ID_82540EP_LP:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   780
	case E1000_DEV_ID_82541EI:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   781
	case E1000_DEV_ID_82541EI_MOBILE:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   782
	case E1000_DEV_ID_82541ER:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   783
	case E1000_DEV_ID_82541ER_LOM:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   784
	case E1000_DEV_ID_82541GI:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   785
	case E1000_DEV_ID_82541GI_LF:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   786
	case E1000_DEV_ID_82541GI_MOBILE:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   787
	case E1000_DEV_ID_82544EI_COPPER:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   788
	case E1000_DEV_ID_82544EI_FIBER:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   789
	case E1000_DEV_ID_82544GC_COPPER:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   790
	case E1000_DEV_ID_82544GC_LOM:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   791
	case E1000_DEV_ID_82545EM_COPPER:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   792
	case E1000_DEV_ID_82545EM_FIBER:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   793
	case E1000_DEV_ID_82546EB_COPPER:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   794
	case E1000_DEV_ID_82546EB_FIBER:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   795
	case E1000_DEV_ID_82546EB_QUAD_COPPER:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   796
		return true;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   797
	default:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   798
		return false;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   799
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   800
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   801
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   802
static const struct net_device_ops e1000_netdev_ops = {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   803
	.ndo_open		= e1000_open,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   804
	.ndo_stop		= e1000_close,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   805
	.ndo_start_xmit		= e1000_xmit_frame,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   806
	.ndo_get_stats		= e1000_get_stats,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   807
	.ndo_set_rx_mode	= e1000_set_rx_mode,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   808
	.ndo_set_mac_address	= e1000_set_mac,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   809
	.ndo_tx_timeout 	= e1000_tx_timeout,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   810
	.ndo_change_mtu		= e1000_change_mtu,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   811
	.ndo_do_ioctl		= e1000_ioctl,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   812
	.ndo_validate_addr	= eth_validate_addr,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   813
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   814
	.ndo_vlan_rx_register	= e1000_vlan_rx_register,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   815
	.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
   816
	.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
   817
#ifdef CONFIG_NET_POLL_CONTROLLER
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   818
	.ndo_poll_controller	= e1000_netpoll,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   819
#endif
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   820
};
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   821
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   822
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   823
 * e1000_probe - Device Initialization Routine
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   824
 * @pdev: PCI device information struct
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   825
 * @ent: entry in e1000_pci_tbl
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   826
 *
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   827
 * Returns 0 on success, negative on failure
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
 * 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
   830
 * The OS initialization, configuring of the adapter private structure,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   831
 * and a hardware reset occur.
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   832
 **/
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   833
static int __devinit e1000_probe(struct pci_dev *pdev,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   834
				 const struct pci_device_id *ent)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   835
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   836
	struct net_device *netdev;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   837
	struct e1000_adapter *adapter;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   838
	struct e1000_hw *hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   839
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   840
	static int cards_found = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   841
	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
   842
	int i, err, pci_using_dac;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   843
	u16 eeprom_data = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   844
	u16 eeprom_apme_mask = E1000_EEPROM_APME;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   845
	int bars, need_ioport;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   846
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   847
	/* do not allocate ioport bars when not needed */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   848
	need_ioport = e1000_is_need_ioport(pdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   849
	if (need_ioport) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   850
		bars = pci_select_bars(pdev, IORESOURCE_MEM | IORESOURCE_IO);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   851
		err = pci_enable_device(pdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   852
	} else {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   853
		bars = pci_select_bars(pdev, IORESOURCE_MEM);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   854
		err = pci_enable_device_mem(pdev);
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
	if (err)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   857
		return err;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   858
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   859
	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
   860
	    !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
   861
		pci_using_dac = 1;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   862
	} else {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   863
		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
   864
		if (err) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   865
			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
   866
			if (err) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   867
				E1000_ERR("No usable DMA configuration, "
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   868
					  "aborting\n");
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   869
				goto err_dma;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   870
			}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   871
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   872
		pci_using_dac = 0;
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
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   875
	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
   876
	if (err)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   877
		goto err_pci_reg;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   878
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   879
	pci_set_master(pdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   880
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   881
	err = -ENOMEM;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   882
	netdev = alloc_etherdev(sizeof(struct e1000_adapter));
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   883
	if (!netdev)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   884
		goto err_alloc_etherdev;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   885
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   886
	SET_NETDEV_DEV(netdev, &pdev->dev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   887
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   888
	pci_set_drvdata(pdev, netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   889
	adapter = netdev_priv(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   890
	adapter->netdev = netdev;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   891
	adapter->pdev = pdev;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   892
	adapter->msg_enable = (1 << debug) - 1;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   893
	adapter->bars = bars;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   894
	adapter->need_ioport = need_ioport;
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
	hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   897
	hw->back = adapter;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   898
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   899
	err = -EIO;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   900
	hw->hw_addr = pci_ioremap_bar(pdev, BAR_0);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   901
	if (!hw->hw_addr)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   902
		goto err_ioremap;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   903
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   904
	if (adapter->need_ioport) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   905
		for (i = BAR_1; i <= BAR_5; i++) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   906
			if (pci_resource_len(pdev, i) == 0)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   907
				continue;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   908
			if (pci_resource_flags(pdev, i) & IORESOURCE_IO) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   909
				hw->io_base = pci_resource_start(pdev, i);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   910
				break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   911
			}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   912
		}
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
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   915
	netdev->netdev_ops = &e1000_netdev_ops;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   916
	e1000_set_ethtool_ops(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   917
	netdev->watchdog_timeo = 5 * HZ;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   918
	netif_napi_add(netdev, &adapter->napi, e1000_clean, 64);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   919
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   920
	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
   921
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   922
	adapter->bd_number = cards_found;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   923
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   924
	/* setup the private structure */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   925
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   926
	err = e1000_sw_init(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   927
	if (err)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   928
		goto err_sw_init;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   929
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   930
	err = -EIO;
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
	if (hw->mac_type >= e1000_82543) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   933
		netdev->features = NETIF_F_SG |
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   934
				   NETIF_F_HW_CSUM |
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   935
				   NETIF_F_HW_VLAN_TX |
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   936
				   NETIF_F_HW_VLAN_RX |
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   937
				   NETIF_F_HW_VLAN_FILTER;
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
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   940
	if ((hw->mac_type >= e1000_82544) &&
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   941
	   (hw->mac_type != e1000_82547))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   942
		netdev->features |= NETIF_F_TSO;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   943
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   944
	if (pci_using_dac)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   945
		netdev->features |= NETIF_F_HIGHDMA;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   946
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   947
	netdev->vlan_features |= NETIF_F_TSO;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   948
	netdev->vlan_features |= NETIF_F_HW_CSUM;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   949
	netdev->vlan_features |= NETIF_F_SG;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   950
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   951
	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
   952
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   953
	/* initialize eeprom parameters */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   954
	if (e1000_init_eeprom_params(hw)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   955
		E1000_ERR("EEPROM initialization failed\n");
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   956
		goto err_eeprom;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   957
	}
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
	/* before reading the EEPROM, reset the controller to
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   960
	 * put the device in a known good starting state */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   961
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   962
	e1000_reset_hw(hw);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   963
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   964
	/* make sure the EEPROM is good */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   965
	if (e1000_validate_eeprom_checksum(hw) < 0) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   966
		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
   967
		e1000_dump_eeprom(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
		 * 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
   970
		 * disable this device for the user. This blocks regular
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   971
		 * traffic while still permitting ethtool ioctls from reaching
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   972
		 * 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
   973
		 * interface after manually setting a hw addr using
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   974
		 * `ip set address`
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   975
		 */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   976
		memset(hw->mac_addr, 0, netdev->addr_len);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   977
	} else {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   978
		/* copy the MAC address out of the EEPROM */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   979
		if (e1000_read_mac_addr(hw))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   980
			DPRINTK(PROBE, ERR, "EEPROM Read Error\n");
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
	/* 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
   983
	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
   984
	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
   985
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   986
	if (!is_valid_ether_addr(netdev->perm_addr))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   987
		DPRINTK(PROBE, ERR, "Invalid MAC Address\n");
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   988
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   989
	e1000_get_bus_info(hw);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   990
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   991
	init_timer(&adapter->tx_fifo_stall_timer);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   992
	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
   993
	adapter->tx_fifo_stall_timer.data = (unsigned long)adapter;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   994
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   995
	init_timer(&adapter->watchdog_timer);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   996
	adapter->watchdog_timer.function = &e1000_watchdog;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
   997
	adapter->watchdog_timer.data = (unsigned long) adapter;
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
	init_timer(&adapter->phy_info_timer);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1000
	adapter->phy_info_timer.function = &e1000_update_phy_info;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1001
	adapter->phy_info_timer.data = (unsigned long)adapter;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1002
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1003
	INIT_WORK(&adapter->reset_task, e1000_reset_task);
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
	e1000_check_options(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1006
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1007
	/* Initial Wake on LAN setting
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1008
	 * If APM wake is enabled in the EEPROM,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1009
	 * enable the ACPI Magic Packet filter
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1010
	 */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1011
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1012
	switch (hw->mac_type) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1013
	case e1000_82542_rev2_0:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1014
	case e1000_82542_rev2_1:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1015
	case e1000_82543:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1016
		break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1017
	case e1000_82544:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1018
		e1000_read_eeprom(hw,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1019
			EEPROM_INIT_CONTROL2_REG, 1, &eeprom_data);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1020
		eeprom_apme_mask = E1000_EEPROM_82544_APM;
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_82546:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1023
	case e1000_82546_rev_3:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1024
		if (er32(STATUS) & E1000_STATUS_FUNC_1){
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1025
			e1000_read_eeprom(hw,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1026
				EEPROM_INIT_CONTROL3_PORT_B, 1, &eeprom_data);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1027
			break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1028
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1029
		/* Fall Through */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1030
	default:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1031
		e1000_read_eeprom(hw,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1032
			EEPROM_INIT_CONTROL3_PORT_A, 1, &eeprom_data);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1033
		break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1034
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1035
	if (eeprom_data & eeprom_apme_mask)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1036
		adapter->eeprom_wol |= E1000_WUFC_MAG;
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
	/* 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
  1039
	 * 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
  1040
	 * wake on lan on a particular port */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1041
	switch (pdev->device) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1042
	case E1000_DEV_ID_82546GB_PCIE:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1043
		adapter->eeprom_wol = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1044
		break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1045
	case E1000_DEV_ID_82546EB_FIBER:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1046
	case E1000_DEV_ID_82546GB_FIBER:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1047
		/* 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
  1048
		 * regardless of eeprom setting */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1049
		if (er32(STATUS) & E1000_STATUS_FUNC_1)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1050
			adapter->eeprom_wol = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1051
		break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1052
	case E1000_DEV_ID_82546GB_QUAD_COPPER_KSP3:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1053
		/* 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
  1054
		if (global_quad_port_a != 0)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1055
			adapter->eeprom_wol = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1056
		else
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1057
			adapter->quad_port_a = 1;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1058
		/* Reset for multiple quad port adapters */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1059
		if (++global_quad_port_a == 4)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1060
			global_quad_port_a = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1061
		break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1062
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1063
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1064
	/* initialize the wol settings based on the eeprom settings */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1065
	adapter->wol = adapter->eeprom_wol;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1066
	device_set_wakeup_enable(&adapter->pdev->dev, adapter->wol);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1067
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1068
	/* print bus type/speed/width info */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1069
	DPRINTK(PROBE, INFO, "(PCI%s:%s:%s) ",
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1070
		((hw->bus_type == e1000_bus_type_pcix) ? "-X" : ""),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1071
		((hw->bus_speed == e1000_bus_speed_133) ? "133MHz" :
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1072
		 (hw->bus_speed == e1000_bus_speed_120) ? "120MHz" :
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1073
		 (hw->bus_speed == e1000_bus_speed_100) ? "100MHz" :
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1074
		 (hw->bus_speed == e1000_bus_speed_66) ? "66MHz" : "33MHz"),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1075
		((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
  1076
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1077
	printk("%pM\n", netdev->dev_addr);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1078
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1079
	/* reset the hardware with the new settings */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1080
	e1000_reset(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1081
2206
983aa34ca11d Minor spacing changes.
Florian Pose <fp@igh-essen.com>
parents: 2163
diff changeset
  1082
	// offer device to EtherCAT master module
1992
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1083
	adapter->ecdev = ecdev_offer(netdev, ec_poll, THIS_MODULE);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1084
	if (adapter->ecdev) {
2589
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2209
diff changeset
  1085
		err = ecdev_open(adapter->ecdev);
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2209
diff changeset
  1086
		if (err) {
1992
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1087
			ecdev_withdraw(adapter->ecdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1088
			goto err_register;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1089
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1090
	} else {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1091
		strcpy(netdev->name, "eth%d");
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1092
		err = register_netdev(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1093
		if (err)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1094
			goto err_register;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1095
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1096
		/* 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
  1097
		netif_carrier_off(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1098
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1099
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1100
	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
  1101
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1102
	cards_found++;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1103
	return 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1104
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1105
err_register:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1106
err_eeprom:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1107
	e1000_phy_hw_reset(hw);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1108
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1109
	if (hw->flash_address)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1110
		iounmap(hw->flash_address);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1111
	kfree(adapter->tx_ring);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1112
	kfree(adapter->rx_ring);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1113
err_sw_init:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1114
	iounmap(hw->hw_addr);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1115
err_ioremap:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1116
	free_netdev(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1117
err_alloc_etherdev:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1118
	pci_release_selected_regions(pdev, bars);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1119
err_pci_reg:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1120
err_dma:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1121
	pci_disable_device(pdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1122
	return err;
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
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
 * e1000_remove - Device Removal Routine
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1127
 * @pdev: PCI device information struct
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1128
 *
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1129
 * 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
  1130
 * 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
  1131
 * 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
  1132
 * memory.
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1133
 **/
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
static void __devexit e1000_remove(struct pci_dev *pdev)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1136
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1137
	struct net_device *netdev = pci_get_drvdata(pdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1138
	struct e1000_adapter *adapter = netdev_priv(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1139
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1140
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1141
	set_bit(__E1000_DOWN, &adapter->flags);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1142
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1143
	if (!adapter->ecdev) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1144
		del_timer_sync(&adapter->tx_fifo_stall_timer);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1145
		del_timer_sync(&adapter->watchdog_timer);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1146
		del_timer_sync(&adapter->phy_info_timer);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1147
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1148
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1149
	cancel_work_sync(&adapter->reset_task);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1150
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1151
	e1000_release_manageability(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1152
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1153
	if (adapter->ecdev) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1154
		ecdev_close(adapter->ecdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1155
		ecdev_withdraw(adapter->ecdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1156
	} else {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1157
		unregister_netdev(netdev);
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
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1160
	e1000_phy_hw_reset(hw);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1161
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1162
	kfree(adapter->tx_ring);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1163
	kfree(adapter->rx_ring);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1164
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1165
	iounmap(hw->hw_addr);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1166
	if (hw->flash_address)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1167
		iounmap(hw->flash_address);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1168
	pci_release_selected_regions(pdev, adapter->bars);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1169
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1170
	free_netdev(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1171
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1172
	pci_disable_device(pdev);
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
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1176
 * 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
  1177
 * @adapter: board private structure to initialize
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1178
 *
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1179
 * e1000_sw_init initializes the Adapter private data structure.
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1180
 * Fields are initialized based on PCI device information and
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1181
 * OS network device settings (MTU size).
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
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1184
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
  1185
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1186
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1187
	struct net_device *netdev = adapter->netdev;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1188
	struct pci_dev *pdev = adapter->pdev;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1189
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1190
	/* PCI config space info */
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
	hw->vendor_id = pdev->vendor;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1193
	hw->device_id = pdev->device;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1194
	hw->subsystem_vendor_id = pdev->subsystem_vendor;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1195
	hw->subsystem_id = pdev->subsystem_device;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1196
	hw->revision_id = pdev->revision;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1197
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1198
	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
  1199
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1200
	adapter->rx_buffer_len = MAXIMUM_ETHERNET_VLAN_SIZE;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1201
	hw->max_frame_size = netdev->mtu +
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1202
			     ENET_HEADER_SIZE + ETHERNET_FCS_SIZE;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1203
	hw->min_frame_size = MINIMUM_ETHERNET_FRAME_SIZE;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1204
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1205
	/* identify the MAC */
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
	if (e1000_set_mac_type(hw)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1208
		DPRINTK(PROBE, ERR, "Unknown MAC Type\n");
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1209
		return -EIO;
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
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1212
	switch (hw->mac_type) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1213
	default:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1214
		break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1215
	case e1000_82541:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1216
	case e1000_82547:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1217
	case e1000_82541_rev_2:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1218
	case e1000_82547_rev_2:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1219
		hw->phy_init_script = 1;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1220
		break;
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
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1223
	e1000_set_media_type(hw);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1224
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1225
	hw->wait_autoneg_complete = false;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1226
	hw->tbi_compatibility_en = true;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1227
	hw->adaptive_ifs = true;
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
	/* Copper options */
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
	if (hw->media_type == e1000_media_type_copper) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1232
		hw->mdix = AUTO_ALL_MODES;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1233
		hw->disable_polarity_correction = false;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1234
		hw->master_slave = E1000_MASTER_SLAVE;
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
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1237
	adapter->num_tx_queues = 1;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1238
	adapter->num_rx_queues = 1;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1239
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1240
	if (e1000_alloc_queues(adapter)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1241
		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
  1242
		return -ENOMEM;
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
	/* 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
  1246
	e1000_irq_disable(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1247
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1248
	spin_lock_init(&adapter->stats_lock);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1249
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1250
	set_bit(__E1000_DOWN, &adapter->flags);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1251
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1252
	return 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1253
}
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
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1256
 * e1000_alloc_queues - Allocate memory for all rings
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1257
 * @adapter: board private structure to initialize
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1258
 *
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1259
 * 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
  1260
 * number of queues at compile-time.
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
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1263
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
  1264
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1265
	adapter->tx_ring = kcalloc(adapter->num_tx_queues,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1266
	                           sizeof(struct e1000_tx_ring), GFP_KERNEL);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1267
	if (!adapter->tx_ring)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1268
		return -ENOMEM;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1269
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1270
	adapter->rx_ring = kcalloc(adapter->num_rx_queues,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1271
	                           sizeof(struct e1000_rx_ring), GFP_KERNEL);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1272
	if (!adapter->rx_ring) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1273
		kfree(adapter->tx_ring);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1274
		return -ENOMEM;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1275
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1276
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1277
	return E1000_SUCCESS;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1278
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1279
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
 * 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
  1282
 * @netdev: network interface device structure
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1283
 *
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1284
 * Returns 0 on success, negative value on failure
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1285
 *
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1286
 * 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
  1287
 * 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
  1288
 * for transmit and receive operations are allocated, the interrupt
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1289
 * 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
  1290
 * 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
  1291
 **/
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1292
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1293
static int e1000_open(struct net_device *netdev)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1294
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1295
	struct e1000_adapter *adapter = netdev_priv(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1296
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1297
	int err;
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
	/* disallow open during test */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1300
	if (test_bit(__E1000_TESTING, &adapter->flags))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1301
		return -EBUSY;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1302
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1303
	netif_carrier_off(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1304
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1305
	/* allocate transmit descriptors */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1306
	err = e1000_setup_all_tx_resources(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1307
	if (err)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1308
		goto err_setup_tx;
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
	/* allocate receive descriptors */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1311
	err = e1000_setup_all_rx_resources(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1312
	if (err)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1313
		goto err_setup_rx;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1314
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1315
	e1000_power_up_phy(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1316
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1317
	adapter->mng_vlan_id = E1000_MNG_VLAN_NONE;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1318
	if ((hw->mng_cookie.status &
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1319
			  E1000_MNG_DHCP_COOKIE_STATUS_VLAN_SUPPORT)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1320
		e1000_update_mng_vlan(adapter);
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
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1323
	/* 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
  1324
	 * 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
  1325
	 * 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
  1326
	 * clean_rx handler before we do so.  */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1327
	e1000_configure(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1328
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1329
	err = e1000_request_irq(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1330
	if (err)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1331
		goto err_req_irq;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1332
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1333
	/* 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
  1334
	clear_bit(__E1000_DOWN, &adapter->flags);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1335
2589
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2209
diff changeset
  1336
	if (!adapter->ecdev) {
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2209
diff changeset
  1337
		napi_enable(&adapter->napi);
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2209
diff changeset
  1338
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2209
diff changeset
  1339
		e1000_irq_enable(adapter);
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2209
diff changeset
  1340
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2209
diff changeset
  1341
		netif_start_queue(netdev);
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2209
diff changeset
  1342
	}
1992
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
	/* 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
  1345
	ew32(ICS, E1000_ICS_LSC);
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
	return E1000_SUCCESS;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1348
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1349
err_req_irq:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1350
	e1000_power_down_phy(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1351
	e1000_free_all_rx_resources(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1352
err_setup_rx:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1353
	e1000_free_all_tx_resources(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1354
err_setup_tx:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1355
	e1000_reset(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1356
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1357
	return err;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1358
}
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
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1361
 * e1000_close - Disables a network interface
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1362
 * @netdev: network interface device structure
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1363
 *
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1364
 * Returns 0, this is not allowed to fail
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
 * 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
  1367
 * 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
  1368
 * 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
  1369
 * hardware, and all transmit and receive resources are freed.
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
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1372
static int e1000_close(struct net_device *netdev)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1373
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1374
	struct e1000_adapter *adapter = netdev_priv(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1375
	struct e1000_hw *hw = &adapter->hw;
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
	WARN_ON(test_bit(__E1000_RESETTING, &adapter->flags));
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1378
	e1000_down(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1379
	e1000_power_down_phy(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1380
	e1000_free_irq(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1381
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1382
	e1000_free_all_tx_resources(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1383
	e1000_free_all_rx_resources(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1384
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1385
	/* 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
  1386
	 * 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
  1387
	if ((hw->mng_cookie.status &
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1388
			  E1000_MNG_DHCP_COOKIE_STATUS_VLAN_SUPPORT) &&
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1389
	     !(adapter->vlgrp &&
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1390
	       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
  1391
		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
  1392
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1393
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1394
	return 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1395
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1396
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
 * 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
  1399
 * @adapter: address of board private structure
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1400
 * @start: address of beginning of memory
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1401
 * @len: length of memory
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1402
 **/
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1403
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
  1404
				  unsigned long len)
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
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1407
	unsigned long begin = (unsigned long)start;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1408
	unsigned long end = begin + len;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1409
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1410
	/* 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
  1411
	 * 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
  1412
	if (hw->mac_type == e1000_82545 ||
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1413
	    hw->mac_type == e1000_82546) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1414
		return ((begin ^ (end - 1)) >> 16) != 0 ? false : true;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1415
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1416
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1417
	return true;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1418
}
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
 * e1000_setup_tx_resources - allocate Tx resources (Descriptors)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1422
 * @adapter: board private structure
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1423
 * @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
  1424
 *
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1425
 * Return 0 on success, negative on failure
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1426
 **/
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1427
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1428
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
  1429
				    struct e1000_tx_ring *txdr)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1430
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1431
	struct pci_dev *pdev = adapter->pdev;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1432
	int size;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1433
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1434
	size = sizeof(struct e1000_buffer) * txdr->count;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1435
	txdr->buffer_info = vmalloc(size);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1436
	if (!txdr->buffer_info) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1437
		DPRINTK(PROBE, ERR,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1438
		"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
  1439
		return -ENOMEM;
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
	memset(txdr->buffer_info, 0, size);
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
	/* round up to nearest 4K */
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
	txdr->size = txdr->count * sizeof(struct e1000_tx_desc);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1446
	txdr->size = ALIGN(txdr->size, 4096);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1447
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1448
	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
  1449
	if (!txdr->desc) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1450
setup_tx_desc_die:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1451
		vfree(txdr->buffer_info);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1452
		DPRINTK(PROBE, ERR,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1453
		"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
  1454
		return -ENOMEM;
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
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1457
	/* Fix for errata 23, can't cross 64kB boundary */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1458
	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
  1459
		void *olddesc = txdr->desc;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1460
		dma_addr_t olddma = txdr->dma;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1461
		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
  1462
				     "at %p\n", txdr->size, txdr->desc);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1463
		/* Try again, without freeing the previous */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1464
		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
  1465
		/* Failed allocation, critical failure */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1466
		if (!txdr->desc) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1467
			pci_free_consistent(pdev, txdr->size, olddesc, olddma);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1468
			goto setup_tx_desc_die;
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
		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
  1472
			/* give up */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1473
			pci_free_consistent(pdev, txdr->size, txdr->desc,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1474
					    txdr->dma);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1475
			pci_free_consistent(pdev, txdr->size, olddesc, olddma);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1476
			DPRINTK(PROBE, ERR,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1477
				"Unable to allocate aligned memory "
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1478
				"for the transmit descriptor ring\n");
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1479
			vfree(txdr->buffer_info);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1480
			return -ENOMEM;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1481
		} else {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1482
			/* Free old allocation, new allocation was successful */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1483
			pci_free_consistent(pdev, txdr->size, olddesc, olddma);
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
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1486
	memset(txdr->desc, 0, txdr->size);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1487
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1488
	txdr->next_to_use = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1489
	txdr->next_to_clean = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1490
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1491
	return 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1492
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1493
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1494
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1495
 * 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
  1496
 * 				  (Descriptors) for all queues
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1497
 * @adapter: board private structure
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1498
 *
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1499
 * Return 0 on success, negative on failure
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1500
 **/
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
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
  1503
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1504
	int i, err = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1505
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1506
	for (i = 0; i < adapter->num_tx_queues; i++) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1507
		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
  1508
		if (err) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1509
			DPRINTK(PROBE, ERR,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1510
				"Allocation for Tx Queue %u failed\n", i);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1511
			for (i-- ; i >= 0; i--)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1512
				e1000_free_tx_resources(adapter,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1513
							&adapter->tx_ring[i]);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1514
			break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1515
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1516
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1517
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1518
	return err;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1519
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1520
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
 * e1000_configure_tx - Configure 8254x Transmit Unit after Reset
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1523
 * @adapter: board private structure
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1524
 *
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1525
 * 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
  1526
 **/
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
static void e1000_configure_tx(struct e1000_adapter *adapter)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1529
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1530
	u64 tdba;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1531
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1532
	u32 tdlen, tctl, tipg;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1533
	u32 ipgr1, ipgr2;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1534
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1535
	/* Setup the HW Tx Head and Tail descriptor pointers */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1536
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1537
	switch (adapter->num_tx_queues) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1538
	case 1:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1539
	default:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1540
		tdba = adapter->tx_ring[0].dma;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1541
		tdlen = adapter->tx_ring[0].count *
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1542
			sizeof(struct e1000_tx_desc);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1543
		ew32(TDLEN, tdlen);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1544
		ew32(TDBAH, (tdba >> 32));
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1545
		ew32(TDBAL, (tdba & 0x00000000ffffffffULL));
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1546
		ew32(TDT, 0);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1547
		ew32(TDH, 0);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1548
		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
  1549
		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
  1550
		break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1551
	}
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
	/* 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
  1554
	if ((hw->media_type == e1000_media_type_fiber ||
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1555
	     hw->media_type == e1000_media_type_internal_serdes))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1556
		tipg = DEFAULT_82543_TIPG_IPGT_FIBER;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1557
	else
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1558
		tipg = DEFAULT_82543_TIPG_IPGT_COPPER;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1559
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1560
	switch (hw->mac_type) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1561
	case e1000_82542_rev2_0:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1562
	case e1000_82542_rev2_1:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1563
		tipg = DEFAULT_82542_TIPG_IPGT;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1564
		ipgr1 = DEFAULT_82542_TIPG_IPGR1;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1565
		ipgr2 = DEFAULT_82542_TIPG_IPGR2;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1566
		break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1567
	default:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1568
		ipgr1 = DEFAULT_82543_TIPG_IPGR1;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1569
		ipgr2 = DEFAULT_82543_TIPG_IPGR2;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1570
		break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1571
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1572
	tipg |= ipgr1 << E1000_TIPG_IPGR1_SHIFT;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1573
	tipg |= ipgr2 << E1000_TIPG_IPGR2_SHIFT;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1574
	ew32(TIPG, tipg);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1575
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1576
	/* Set the Tx Interrupt Delay register */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1577
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1578
	ew32(TIDV, adapter->tx_int_delay);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1579
	if (hw->mac_type >= e1000_82540)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1580
		ew32(TADV, adapter->tx_abs_int_delay);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1581
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1582
	/* Program the Transmit Control Register */
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
	tctl = er32(TCTL);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1585
	tctl &= ~E1000_TCTL_CT;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1586
	tctl |= E1000_TCTL_PSP | E1000_TCTL_RTLC |
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1587
		(E1000_COLLISION_THRESHOLD << E1000_CT_SHIFT);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1588
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1589
	e1000_config_collision_dist(hw);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1590
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1591
	/* Setup Transmit Descriptor Settings for eop descriptor */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1592
	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
  1593
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1594
	/* 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
  1595
	if (adapter->tx_int_delay)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1596
		adapter->txd_cmd |= E1000_TXD_CMD_IDE;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1597
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1598
	if (hw->mac_type < e1000_82543)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1599
		adapter->txd_cmd |= E1000_TXD_CMD_RPS;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1600
	else
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1601
		adapter->txd_cmd |= E1000_TXD_CMD_RS;
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
	/* 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
  1604
	 * 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
  1605
	if (hw->mac_type == e1000_82544 &&
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1606
	    hw->bus_type == e1000_bus_type_pcix)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1607
		adapter->pcix_82544 = 1;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1608
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1609
	ew32(TCTL, tctl);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1610
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1611
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1612
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1613
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1614
 * e1000_setup_rx_resources - allocate Rx resources (Descriptors)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1615
 * @adapter: board private structure
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1616
 * @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
  1617
 *
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1618
 * Returns 0 on success, negative on failure
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
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1621
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
  1622
				    struct e1000_rx_ring *rxdr)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1623
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1624
	struct pci_dev *pdev = adapter->pdev;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1625
	int size, desc_len;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1626
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1627
	size = sizeof(struct e1000_buffer) * rxdr->count;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1628
	rxdr->buffer_info = vmalloc(size);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1629
	if (!rxdr->buffer_info) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1630
		DPRINTK(PROBE, ERR,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1631
		"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
  1632
		return -ENOMEM;
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->buffer_info, 0, 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
	desc_len = sizeof(struct e1000_rx_desc);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1637
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1638
	/* Round up to nearest 4K */
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
	rxdr->size = rxdr->count * desc_len;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1641
	rxdr->size = ALIGN(rxdr->size, 4096);
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
	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
  1644
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1645
	if (!rxdr->desc) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1646
		DPRINTK(PROBE, ERR,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1647
		"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
  1648
setup_rx_desc_die:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1649
		vfree(rxdr->buffer_info);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1650
		return -ENOMEM;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1651
	}
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
	/* Fix for errata 23, can't cross 64kB boundary */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1654
	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
  1655
		void *olddesc = rxdr->desc;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1656
		dma_addr_t olddma = rxdr->dma;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1657
		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
  1658
				     "at %p\n", rxdr->size, rxdr->desc);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1659
		/* Try again, without freeing the previous */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1660
		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
  1661
		/* Failed allocation, critical failure */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1662
		if (!rxdr->desc) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1663
			pci_free_consistent(pdev, rxdr->size, olddesc, olddma);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1664
			DPRINTK(PROBE, ERR,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1665
				"Unable to allocate memory "
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1666
				"for the receive descriptor ring\n");
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1667
			goto setup_rx_desc_die;
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
		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
  1671
			/* give up */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1672
			pci_free_consistent(pdev, rxdr->size, rxdr->desc,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1673
					    rxdr->dma);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1674
			pci_free_consistent(pdev, rxdr->size, olddesc, olddma);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1675
			DPRINTK(PROBE, ERR,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1676
				"Unable to allocate aligned memory "
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1677
				"for the receive descriptor ring\n");
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1678
			goto setup_rx_desc_die;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1679
		} else {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1680
			/* Free old allocation, new allocation was successful */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1681
			pci_free_consistent(pdev, rxdr->size, olddesc, olddma);
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
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1684
	memset(rxdr->desc, 0, rxdr->size);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1685
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1686
	rxdr->next_to_clean = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1687
	rxdr->next_to_use = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1688
	rxdr->rx_skb_top = NULL;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1689
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1690
	return 0;
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
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1693
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1694
 * 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
  1695
 * 				  (Descriptors) for all queues
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1696
 * @adapter: board private structure
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1697
 *
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1698
 * Return 0 on success, negative on failure
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1699
 **/
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1700
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1701
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
  1702
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1703
	int i, err = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1704
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1705
	for (i = 0; i < adapter->num_rx_queues; i++) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1706
		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
  1707
		if (err) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1708
			DPRINTK(PROBE, ERR,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1709
				"Allocation for Rx Queue %u failed\n", i);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1710
			for (i-- ; i >= 0; i--)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1711
				e1000_free_rx_resources(adapter,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1712
							&adapter->rx_ring[i]);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1713
			break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1714
		}
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
	return err;
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_setup_rctl - configure the receive control registers
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
static void e1000_setup_rctl(struct e1000_adapter *adapter)
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
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1727
	u32 rctl;
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
	rctl = er32(RCTL);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1730
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1731
	rctl &= ~(3 << E1000_RCTL_MO_SHIFT);
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
	rctl |= E1000_RCTL_EN | E1000_RCTL_BAM |
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1734
		E1000_RCTL_LBM_NO | E1000_RCTL_RDMTS_HALF |
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1735
		(hw->mc_filter_type << E1000_RCTL_MO_SHIFT);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1736
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1737
	if (hw->tbi_compatibility_on == 1)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1738
		rctl |= E1000_RCTL_SBP;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1739
	else
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1740
		rctl &= ~E1000_RCTL_SBP;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1741
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1742
	if (adapter->netdev->mtu <= ETH_DATA_LEN)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1743
		rctl &= ~E1000_RCTL_LPE;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1744
	else
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1745
		rctl |= E1000_RCTL_LPE;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1746
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1747
	/* Setup buffer sizes */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1748
	rctl &= ~E1000_RCTL_SZ_4096;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1749
	rctl |= E1000_RCTL_BSEX;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1750
	switch (adapter->rx_buffer_len) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1751
		case E1000_RXBUFFER_2048:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1752
		default:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1753
			rctl |= E1000_RCTL_SZ_2048;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1754
			rctl &= ~E1000_RCTL_BSEX;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1755
			break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1756
		case E1000_RXBUFFER_4096:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1757
			rctl |= E1000_RCTL_SZ_4096;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1758
			break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1759
		case E1000_RXBUFFER_8192:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1760
			rctl |= E1000_RCTL_SZ_8192;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1761
			break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1762
		case E1000_RXBUFFER_16384:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1763
			rctl |= E1000_RCTL_SZ_16384;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1764
			break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1765
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1766
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1767
	ew32(RCTL, rctl);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1768
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1769
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1770
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1771
 * e1000_configure_rx - Configure 8254x Receive Unit after Reset
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1772
 * @adapter: board private structure
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
 * 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
  1775
 **/
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1776
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1777
static void e1000_configure_rx(struct e1000_adapter *adapter)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1778
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1779
	u64 rdba;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1780
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1781
	u32 rdlen, rctl, rxcsum;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1782
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1783
	if (adapter->netdev->mtu > ETH_DATA_LEN) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1784
		rdlen = adapter->rx_ring[0].count *
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1785
		        sizeof(struct e1000_rx_desc);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1786
		adapter->clean_rx = e1000_clean_jumbo_rx_irq;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1787
		adapter->alloc_rx_buf = e1000_alloc_jumbo_rx_buffers;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1788
	} else {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1789
		rdlen = adapter->rx_ring[0].count *
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1790
		        sizeof(struct e1000_rx_desc);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1791
		adapter->clean_rx = e1000_clean_rx_irq;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1792
		adapter->alloc_rx_buf = e1000_alloc_rx_buffers;
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
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1795
	/* disable receives while setting up the descriptors */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1796
	rctl = er32(RCTL);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1797
	ew32(RCTL, rctl & ~E1000_RCTL_EN);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1798
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1799
	/* set the Receive Delay Timer Register */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1800
	ew32(RDTR, adapter->rx_int_delay);
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
	if (hw->mac_type >= e1000_82540) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1803
		ew32(RADV, adapter->rx_abs_int_delay);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1804
		if (adapter->itr_setting != 0)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1805
			ew32(ITR, 1000000000 / (adapter->itr * 256));
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
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1808
	/* 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
  1809
	 * the Base and Length of the Rx Descriptor Ring */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1810
	switch (adapter->num_rx_queues) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1811
	case 1:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1812
	default:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1813
		rdba = adapter->rx_ring[0].dma;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1814
		ew32(RDLEN, rdlen);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1815
		ew32(RDBAH, (rdba >> 32));
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1816
		ew32(RDBAL, (rdba & 0x00000000ffffffffULL));
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1817
		ew32(RDT, 0);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1818
		ew32(RDH, 0);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1819
		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
  1820
		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
  1821
		break;
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
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1824
	/* Enable 82543 Receive Checksum Offload for TCP and UDP */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1825
	if (hw->mac_type >= e1000_82543) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1826
		rxcsum = er32(RXCSUM);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1827
		if (adapter->rx_csum)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1828
			rxcsum |= E1000_RXCSUM_TUOFL;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1829
		else
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1830
			/* 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
  1831
			rxcsum &= ~E1000_RXCSUM_TUOFL;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1832
		ew32(RXCSUM, rxcsum);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1833
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1834
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1835
	/* Enable Receives */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1836
	ew32(RCTL, rctl);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1837
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1838
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
 * e1000_free_tx_resources - Free Tx Resources per Queue
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1841
 * @adapter: board private structure
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1842
 * @tx_ring: Tx descriptor ring for a specific queue
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
 * Free all transmit software resources
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1845
 **/
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
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
  1848
				    struct e1000_tx_ring *tx_ring)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1849
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1850
	struct pci_dev *pdev = adapter->pdev;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1851
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1852
	e1000_clean_tx_ring(adapter, tx_ring);
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
	vfree(tx_ring->buffer_info);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1855
	tx_ring->buffer_info = NULL;
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
	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
  1858
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1859
	tx_ring->desc = NULL;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1860
}
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
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1863
 * 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
  1864
 * @adapter: board private structure
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1865
 *
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1866
 * Free all transmit software resources
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
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
  1870
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1871
	int i;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1872
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1873
	for (i = 0; i < adapter->num_tx_queues; i++)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1874
		e1000_free_tx_resources(adapter, &adapter->tx_ring[i]);
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
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1877
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
  1878
					     struct e1000_buffer *buffer_info)
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
	if (adapter->ecdev)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1881
		return;
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
	if (buffer_info->dma) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1884
		if (buffer_info->mapped_as_page)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1885
			pci_unmap_page(adapter->pdev, buffer_info->dma,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1886
				       buffer_info->length, PCI_DMA_TODEVICE);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1887
		else
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1888
			pci_unmap_single(adapter->pdev,	buffer_info->dma,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1889
					 buffer_info->length,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1890
					 PCI_DMA_TODEVICE);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1891
		buffer_info->dma = 0;
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
	if (buffer_info->skb) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1894
		dev_kfree_skb_any(buffer_info->skb);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1895
		buffer_info->skb = NULL;
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
	buffer_info->time_stamp = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1898
	/* 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
  1899
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1900
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
 * e1000_clean_tx_ring - Free Tx Buffers
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1903
 * @adapter: board private structure
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1904
 * @tx_ring: ring to be cleaned
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1905
 **/
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1906
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1907
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
  1908
				struct e1000_tx_ring *tx_ring)
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
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1911
	struct e1000_buffer *buffer_info;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1912
	unsigned long size;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1913
	unsigned int i;
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
	/* Free all the Tx ring sk_buffs */
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
	for (i = 0; i < tx_ring->count; i++) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1918
		buffer_info = &tx_ring->buffer_info[i];
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1919
		e1000_unmap_and_free_tx_resource(adapter, buffer_info);
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
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1922
	size = sizeof(struct e1000_buffer) * tx_ring->count;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1923
	memset(tx_ring->buffer_info, 0, size);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1924
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1925
	/* Zero out the descriptor ring */
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
	memset(tx_ring->desc, 0, tx_ring->size);
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
	tx_ring->next_to_use = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1930
	tx_ring->next_to_clean = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1931
	tx_ring->last_tx_tso = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1932
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1933
	writel(0, hw->hw_addr + tx_ring->tdh);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1934
	writel(0, hw->hw_addr + tx_ring->tdt);
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
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1937
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1938
 * 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
  1939
 * @adapter: board private structure
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
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1942
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
  1943
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1944
	int i;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1945
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1946
	for (i = 0; i < adapter->num_tx_queues; i++)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1947
		e1000_clean_tx_ring(adapter, &adapter->tx_ring[i]);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1948
}
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
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1951
 * e1000_free_rx_resources - Free Rx Resources
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1952
 * @adapter: board private structure
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1953
 * @rx_ring: ring to clean the resources from
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1954
 *
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1955
 * Free all receive software resources
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1956
 **/
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1957
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1958
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
  1959
				    struct e1000_rx_ring *rx_ring)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1960
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1961
	struct pci_dev *pdev = adapter->pdev;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1962
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1963
	e1000_clean_rx_ring(adapter, rx_ring);
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
	vfree(rx_ring->buffer_info);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1966
	rx_ring->buffer_info = NULL;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1967
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1968
	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
  1969
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1970
	rx_ring->desc = NULL;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1971
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1972
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
 * 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
  1975
 * @adapter: board private structure
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1976
 *
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1977
 * Free all receive software resources
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1978
 **/
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1979
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1980
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
  1981
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1982
	int i;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1983
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1984
	for (i = 0; i < adapter->num_rx_queues; i++)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1985
		e1000_free_rx_resources(adapter, &adapter->rx_ring[i]);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1986
}
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
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1989
 * e1000_clean_rx_ring - Free Rx Buffers per Queue
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1990
 * @adapter: board private structure
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1991
 * @rx_ring: ring to free buffers from
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1992
 **/
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
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
  1995
				struct e1000_rx_ring *rx_ring)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1996
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1997
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1998
	struct e1000_buffer *buffer_info;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  1999
	struct pci_dev *pdev = adapter->pdev;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2000
	unsigned long size;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2001
	unsigned int i;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2002
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2003
	/* Free all the Rx ring sk_buffs */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2004
	for (i = 0; i < rx_ring->count; i++) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2005
		buffer_info = &rx_ring->buffer_info[i];
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2006
		if (buffer_info->dma &&
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2007
		    adapter->clean_rx == e1000_clean_rx_irq) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2008
			pci_unmap_single(pdev, buffer_info->dma,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2009
			                 buffer_info->length,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2010
			                 PCI_DMA_FROMDEVICE);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2011
		} else if (buffer_info->dma &&
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2012
		           adapter->clean_rx == e1000_clean_jumbo_rx_irq) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2013
			pci_unmap_page(pdev, buffer_info->dma,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2014
			               buffer_info->length,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2015
			               PCI_DMA_FROMDEVICE);
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
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2018
		buffer_info->dma = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2019
		if (buffer_info->page) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2020
			put_page(buffer_info->page);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2021
			buffer_info->page = NULL;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2022
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2023
		if (buffer_info->skb) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2024
			dev_kfree_skb(buffer_info->skb);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2025
			buffer_info->skb = NULL;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2026
		}
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
	/* 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
  2030
	if (rx_ring->rx_skb_top) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2031
		dev_kfree_skb(rx_ring->rx_skb_top);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2032
		rx_ring->rx_skb_top = NULL;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2033
	}
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
	size = sizeof(struct e1000_buffer) * rx_ring->count;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2036
	memset(rx_ring->buffer_info, 0, size);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2037
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2038
	/* Zero out the descriptor ring */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2039
	memset(rx_ring->desc, 0, rx_ring->size);
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
	rx_ring->next_to_clean = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2042
	rx_ring->next_to_use = 0;
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
	writel(0, hw->hw_addr + rx_ring->rdh);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2045
	writel(0, hw->hw_addr + rx_ring->rdt);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2046
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2047
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2048
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2049
 * 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
  2050
 * @adapter: board private structure
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
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
  2054
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2055
	int i;
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
	for (i = 0; i < adapter->num_rx_queues; i++)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2058
		e1000_clean_rx_ring(adapter, &adapter->rx_ring[i]);
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
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2061
/* 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
  2062
 * and memory write and invalidate disabled for certain operations
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2063
 */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2064
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
  2065
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2066
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2067
	struct net_device *netdev = adapter->netdev;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2068
	u32 rctl;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2069
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2070
	e1000_pci_clear_mwi(hw);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2071
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2072
	rctl = er32(RCTL);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2073
	rctl |= E1000_RCTL_RST;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2074
	ew32(RCTL, rctl);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2075
	E1000_WRITE_FLUSH();
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2076
	mdelay(5);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2077
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2078
	if (!adapter->ecdev && netif_running(netdev))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2079
		e1000_clean_all_rx_rings(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2080
}
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
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
  2083
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2084
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2085
	struct net_device *netdev = adapter->netdev;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2086
	u32 rctl;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2087
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2088
	rctl = er32(RCTL);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2089
	rctl &= ~E1000_RCTL_RST;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2090
	ew32(RCTL, rctl);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2091
	E1000_WRITE_FLUSH();
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2092
	mdelay(5);
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
	if (hw->pci_cmd_word & PCI_COMMAND_INVALIDATE)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2095
		e1000_pci_set_mwi(hw);
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
	if (!adapter->netdev && netif_running(netdev)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2098
		/* 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
  2099
		struct e1000_rx_ring *ring = &adapter->rx_ring[0];
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2100
		e1000_configure_rx(adapter);
2589
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2209
diff changeset
  2101
		if (adapter->ecdev) {
1992
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2102
			/* fill rx ring completely! */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2103
			adapter->alloc_rx_buf(adapter, ring, ring->count);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2104
		} else {
2206
983aa34ca11d Minor spacing changes.
Florian Pose <fp@igh-essen.com>
parents: 2163
diff changeset
  2105
			/* this one leaves the last ring element unallocated! */
1992
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2106
			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
  2107
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2108
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2109
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2110
}
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
 * 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
  2114
 * @netdev: network interface device structure
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2115
 * @p: pointer to an address structure
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
 * Returns 0 on success, negative on failure
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2118
 **/
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2119
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2120
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
  2121
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2122
	struct e1000_adapter *adapter = netdev_priv(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2123
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2124
	struct sockaddr *addr = p;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2125
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2126
	if (!is_valid_ether_addr(addr->sa_data))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2127
		return -EADDRNOTAVAIL;
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
	/* 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
  2130
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2131
	if (hw->mac_type == e1000_82542_rev2_0)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2132
		e1000_enter_82542_rst(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2133
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2134
	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
  2135
	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
  2136
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2137
	e1000_rar_set(hw, hw->mac_addr, 0);
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
	if (hw->mac_type == e1000_82542_rev2_0)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2140
		e1000_leave_82542_rst(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2141
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2142
	return 0;
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
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2145
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2146
 * 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
  2147
 * @netdev: network interface device structure
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2148
 *
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2149
 * 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
  2150
 * 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
  2151
 * responsible for configuring the hardware for proper unicast, multicast,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2152
 * promiscuous mode, and all-multi behavior.
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2153
 **/
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2154
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2155
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
  2156
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2157
	struct e1000_adapter *adapter = netdev_priv(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2158
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2159
	struct netdev_hw_addr *ha;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2160
	bool use_uc = false;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2161
	struct dev_addr_list *mc_ptr;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2162
	u32 rctl;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2163
	u32 hash_value;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2164
	int i, rar_entries = E1000_RAR_ENTRIES;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2165
	int mta_reg_count = E1000_NUM_MTA_REGISTERS;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2166
	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
  2167
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2168
	if (!mcarray) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2169
		DPRINTK(PROBE, ERR, "memory allocation failed\n");
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2170
		return;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2171
	}
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
	/* Check for Promiscuous and All Multicast modes */
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
	rctl = er32(RCTL);
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
	if (netdev->flags & IFF_PROMISC) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2178
		rctl |= (E1000_RCTL_UPE | E1000_RCTL_MPE);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2179
		rctl &= ~E1000_RCTL_VFE;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2180
	} else {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2181
		if (netdev->flags & IFF_ALLMULTI)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2182
			rctl |= E1000_RCTL_MPE;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2183
		else
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2184
			rctl &= ~E1000_RCTL_MPE;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2185
		/* Enable VLAN filter if there is a VLAN */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2186
		if (adapter->vlgrp)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2187
			rctl |= E1000_RCTL_VFE;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2188
	}
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 (netdev->uc.count > rar_entries - 1) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2191
		rctl |= E1000_RCTL_UPE;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2192
	} else if (!(netdev->flags & IFF_PROMISC)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2193
		rctl &= ~E1000_RCTL_UPE;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2194
		use_uc = true;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2195
	}
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
	ew32(RCTL, rctl);
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
	/* 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
  2200
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2201
	if (hw->mac_type == e1000_82542_rev2_0)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2202
		e1000_enter_82542_rst(adapter);
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
	/* 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
  2205
	 * addresses take precedence to avoid disabling unicast filtering
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2206
	 * when possible.
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
	 * RAR 0 is used for the station MAC adddress
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2209
	 * 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
  2210
	 */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2211
	i = 1;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2212
	if (use_uc)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2213
		list_for_each_entry(ha, &netdev->uc.list, list) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2214
			if (i == rar_entries)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2215
				break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2216
			e1000_rar_set(hw, ha->addr, i++);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2217
		}
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
	WARN_ON(i == rar_entries);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2220
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2221
	mc_ptr = netdev->mc_list;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2222
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2223
	for (; i < rar_entries; i++) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2224
		if (mc_ptr) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2225
			e1000_rar_set(hw, mc_ptr->da_addr, i);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2226
			mc_ptr = mc_ptr->next;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2227
		} else {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2228
			E1000_WRITE_REG_ARRAY(hw, RA, i << 1, 0);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2229
			E1000_WRITE_FLUSH();
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2230
			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
  2231
			E1000_WRITE_FLUSH();
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2232
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2233
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2234
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2235
	/* load any remaining addresses into the hash table */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2236
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2237
	for (; mc_ptr; mc_ptr = mc_ptr->next) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2238
		u32 hash_reg, hash_bit, mta;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2239
		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
  2240
		hash_reg = (hash_value >> 5) & 0x7F;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2241
		hash_bit = hash_value & 0x1F;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2242
		mta = (1 << hash_bit);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2243
		mcarray[hash_reg] |= mta;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2244
	}
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
	/* 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
  2247
	 * both stupid write combining chipsets, and flushing each write */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2248
	for (i = mta_reg_count - 1; i >= 0 ; i--) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2249
		/*
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2250
		 * 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
  2251
		 * offsets overwrites the previous even offset, but writing
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2252
		 * backwards over the range solves the issue by always
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2253
		 * writing the odd offset first
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2254
		 */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2255
		E1000_WRITE_REG_ARRAY(hw, MTA, i, mcarray[i]);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2256
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2257
	E1000_WRITE_FLUSH();
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
	if (hw->mac_type == e1000_82542_rev2_0)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2260
		e1000_leave_82542_rst(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2261
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2262
	kfree(mcarray);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2263
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2264
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2265
/* 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
  2266
 * the phy */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2267
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2268
static void e1000_update_phy_info(unsigned long data)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2269
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2270
	struct e1000_adapter *adapter = (struct e1000_adapter *)data;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2271
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2272
	e1000_phy_get_info(hw, &adapter->phy_info);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2273
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2274
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2275
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2276
 * e1000_82547_tx_fifo_stall - Timer Call-back
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2277
 * @data: pointer to adapter cast into an unsigned long
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
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
  2281
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2282
	struct e1000_adapter *adapter = (struct e1000_adapter *)data;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2283
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2284
	struct net_device *netdev = adapter->netdev;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2285
	u32 tctl;
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
	if (atomic_read(&adapter->tx_fifo_stall)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2288
		if ((er32(TDT) == er32(TDH)) &&
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2289
		   (er32(TDFT) == er32(TDFH)) &&
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2290
		   (er32(TDFTS) == er32(TDFHS))) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2291
			tctl = er32(TCTL);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2292
			ew32(TCTL, tctl & ~E1000_TCTL_EN);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2293
			ew32(TDFT, adapter->tx_head_addr);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2294
			ew32(TDFH, adapter->tx_head_addr);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2295
			ew32(TDFTS, adapter->tx_head_addr);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2296
			ew32(TDFHS, adapter->tx_head_addr);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2297
			ew32(TCTL, tctl);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2298
			E1000_WRITE_FLUSH();
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2299
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2300
			adapter->tx_fifo_head = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2301
			atomic_set(&adapter->tx_fifo_stall, 0);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2302
			if (!adapter->ecdev) netif_wake_queue(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2303
		} else if (!test_bit(__E1000_DOWN, &adapter->flags)) {
2589
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2209
diff changeset
  2304
			if (!adapter->ecdev)
1992
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2305
				mod_timer(&adapter->tx_fifo_stall_timer, jiffies + 1);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2306
		}
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
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2309
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2310
static bool e1000_has_link(struct e1000_adapter *adapter)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2311
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2312
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2313
	bool link_active = false;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2314
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2315
	/* 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
  2316
	 * rx sequence error interrupt.  get_link_status will stay
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2317
	 * false until the e1000_check_for_link establishes link
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2318
	 * for copper adapters ONLY
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
	switch (hw->media_type) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2321
	case e1000_media_type_copper:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2322
		if (hw->get_link_status) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2323
			e1000_check_for_link(hw);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2324
			link_active = !hw->get_link_status;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2325
		} else {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2326
			link_active = true;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2327
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2328
		break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2329
	case e1000_media_type_fiber:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2330
		e1000_check_for_link(hw);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2331
		link_active = !!(er32(STATUS) & E1000_STATUS_LU);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2332
		break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2333
	case e1000_media_type_internal_serdes:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2334
		e1000_check_for_link(hw);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2335
		link_active = hw->serdes_has_link;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2336
		break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2337
	default:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2338
		break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2339
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2340
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2341
	return link_active;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2342
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2343
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2344
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2345
 * e1000_watchdog - Timer Call-back
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2346
 * @data: pointer to adapter cast into an unsigned long
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
static void e1000_watchdog(unsigned long data)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2349
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2350
	struct e1000_adapter *adapter = (struct e1000_adapter *)data;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2351
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2352
	struct net_device *netdev = adapter->netdev;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2353
	struct e1000_tx_ring *txdr = adapter->tx_ring;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2354
	u32 link, tctl;
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
	link = e1000_has_link(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2357
	if (!adapter->ecdev && (netif_carrier_ok(netdev)) && link)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2358
		goto link_up;
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
	if (link) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2361
		if ((adapter->ecdev && !ecdev_get_link(adapter->ecdev))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2362
				|| (!adapter->ecdev && !netif_carrier_ok(netdev))) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2363
			u32 ctrl;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2364
			bool txb2b = true;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2365
			/* update snapshot of PHY registers on LSC */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2366
			e1000_get_speed_and_duplex(hw,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2367
			                           &adapter->link_speed,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2368
			                           &adapter->link_duplex);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2369
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2370
			ctrl = er32(CTRL);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2371
			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
  2372
			       "Flow Control: %s\n",
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2373
			       netdev->name,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2374
			       adapter->link_speed,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2375
			       adapter->link_duplex == FULL_DUPLEX ?
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2376
			        "Full Duplex" : "Half Duplex",
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2377
			        ((ctrl & E1000_CTRL_TFCE) && (ctrl &
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2378
			        E1000_CTRL_RFCE)) ? "RX/TX" : ((ctrl &
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2379
			        E1000_CTRL_RFCE) ? "RX" : ((ctrl &
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2380
			        E1000_CTRL_TFCE) ? "TX" : "None" )));
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2381
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2382
			/* tweak tx_queue_len according to speed/duplex
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2383
			 * and adjust the timeout factor */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2384
			netdev->tx_queue_len = adapter->tx_queue_len;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2385
			adapter->tx_timeout_factor = 1;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2386
			switch (adapter->link_speed) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2387
			case SPEED_10:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2388
				txb2b = false;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2389
				netdev->tx_queue_len = 10;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2390
				adapter->tx_timeout_factor = 16;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2391
				break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2392
			case SPEED_100:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2393
				txb2b = false;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2394
				netdev->tx_queue_len = 100;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2395
				/* maybe add some timeout factor ? */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2396
				break;
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
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2399
			/* enable transmits in the hardware */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2400
			tctl = er32(TCTL);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2401
			tctl |= E1000_TCTL_EN;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2402
			ew32(TCTL, tctl);
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
			if (adapter->ecdev) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2405
				ecdev_set_link(adapter->ecdev, 1);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2406
			} else {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2407
				netif_carrier_on(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2408
				if (!test_bit(__E1000_DOWN, &adapter->flags))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2409
					mod_timer(&adapter->phy_info_timer,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2410
					          round_jiffies(jiffies + 2 * HZ));
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
			adapter->smartspeed = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2413
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2414
	} else {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2415
		if ((adapter->ecdev && ecdev_get_link(adapter->ecdev))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2416
				|| (!adapter->ecdev && netif_carrier_ok(netdev))) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2417
			adapter->link_speed = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2418
			adapter->link_duplex = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2419
			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
  2420
			       netdev->name);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2421
			if (adapter->ecdev) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2422
				ecdev_set_link(adapter->ecdev, 0);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2423
			} else {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2424
				netif_carrier_off(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2425
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2426
				if (!test_bit(__E1000_DOWN, &adapter->flags))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2427
					mod_timer(&adapter->phy_info_timer,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2428
					          round_jiffies(jiffies + 2 * HZ));
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2429
			}
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
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2432
		e1000_smartspeed(adapter);
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
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2435
link_up:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2436
	e1000_update_stats(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2437
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2438
	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
  2439
	adapter->tpt_old = adapter->stats.tpt;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2440
	hw->collision_delta = adapter->stats.colc - adapter->colc_old;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2441
	adapter->colc_old = adapter->stats.colc;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2442
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2443
	adapter->gorcl = adapter->stats.gorcl - adapter->gorcl_old;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2444
	adapter->gorcl_old = adapter->stats.gorcl;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2445
	adapter->gotcl = adapter->stats.gotcl - adapter->gotcl_old;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2446
	adapter->gotcl_old = adapter->stats.gotcl;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2447
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2448
	e1000_update_adaptive(hw);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2449
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2450
	if (!adapter->ecdev && !netif_carrier_ok(netdev)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2451
		if (E1000_DESC_UNUSED(txdr) + 1 < txdr->count) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2452
			/* We've lost link, so the controller stops DMA,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2453
			 * 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
  2454
			 * to get done, so reset controller to flush Tx.
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2455
			 * (Do the reset outside of interrupt context). */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2456
			adapter->tx_timeout_count++;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2457
			schedule_work(&adapter->reset_task);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2458
			/* return immediately since reset is imminent */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2459
			return;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2460
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2461
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2462
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2463
	/* Cause software interrupt to ensure rx ring is cleaned */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2464
	ew32(ICS, E1000_ICS_RXDMT0);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2465
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2466
	/* Force detection of hung controller every watchdog period */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2467
	if (!adapter->ecdev) adapter->detect_tx_hung = true;
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
	/* Reset the timer */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2470
	if (!adapter->ecdev) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2471
		if (!test_bit(__E1000_DOWN, &adapter->flags))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2472
			mod_timer(&adapter->watchdog_timer,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2473
			          round_jiffies(jiffies + 2 * HZ));
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
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2477
enum latency_range {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2478
	lowest_latency = 0,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2479
	low_latency = 1,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2480
	bulk_latency = 2,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2481
	latency_invalid = 255
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2482
};
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2483
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
 * 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
  2486
 * @adapter: pointer to adapter
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2487
 * @itr_setting: current adapter->itr
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2488
 * @packets: the number of packets during this measurement interval
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2489
 * @bytes: the number of bytes during this measurement interval
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
 *      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
  2492
 *      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
  2493
 *      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
  2494
 *      traffic pattern.  Constants in this function were computed
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2495
 *      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
  2496
 *      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
  2497
 *      while increasing bulk throughput.
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2498
 *      this functionality is controlled by the InterruptThrottleRate module
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2499
 *      parameter (see e1000_param.c)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2500
 **/
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2501
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
  2502
				     u16 itr_setting, int packets, int bytes)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2503
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2504
	unsigned int retval = itr_setting;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2505
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2506
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2507
	if (unlikely(hw->mac_type < e1000_82540))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2508
		goto update_itr_done;
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
	if (packets == 0)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2511
		goto update_itr_done;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2512
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2513
	switch (itr_setting) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2514
	case lowest_latency:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2515
		/* jumbo frames get bulk treatment*/
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2516
		if (bytes/packets > 8000)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2517
			retval = bulk_latency;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2518
		else if ((packets < 5) && (bytes > 512))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2519
			retval = low_latency;
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
	case low_latency:  /* 50 usec aka 20000 ints/s */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2522
		if (bytes > 10000) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2523
			/* jumbo frames need bulk latency setting */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2524
			if (bytes/packets > 8000)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2525
				retval = bulk_latency;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2526
			else if ((packets < 10) || ((bytes/packets) > 1200))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2527
				retval = bulk_latency;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2528
			else if ((packets > 35))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2529
				retval = lowest_latency;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2530
		} else if (bytes/packets > 2000)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2531
			retval = bulk_latency;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2532
		else if (packets <= 2 && bytes < 512)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2533
			retval = lowest_latency;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2534
		break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2535
	case bulk_latency: /* 250 usec aka 4000 ints/s */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2536
		if (bytes > 25000) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2537
			if (packets > 35)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2538
				retval = low_latency;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2539
		} else if (bytes < 6000) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2540
			retval = low_latency;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2541
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2542
		break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2543
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2544
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2545
update_itr_done:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2546
	return retval;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2547
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2548
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2549
static void e1000_set_itr(struct e1000_adapter *adapter)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2550
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2551
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2552
	u16 current_itr;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2553
	u32 new_itr = adapter->itr;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2554
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2555
	if (unlikely(hw->mac_type < e1000_82540))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2556
		return;
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
	/* 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
  2559
	if (unlikely(adapter->link_speed != SPEED_1000)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2560
		current_itr = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2561
		new_itr = 4000;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2562
		goto set_itr_now;
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
	adapter->tx_itr = e1000_update_itr(adapter,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2566
	                            adapter->tx_itr,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2567
	                            adapter->total_tx_packets,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2568
	                            adapter->total_tx_bytes);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2569
	/* conservative mode (itr 3) eliminates the lowest_latency setting */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2570
	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
  2571
		adapter->tx_itr = low_latency;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2572
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2573
	adapter->rx_itr = e1000_update_itr(adapter,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2574
	                            adapter->rx_itr,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2575
	                            adapter->total_rx_packets,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2576
	                            adapter->total_rx_bytes);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2577
	/* conservative mode (itr 3) eliminates the lowest_latency setting */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2578
	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
  2579
		adapter->rx_itr = low_latency;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2580
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2581
	current_itr = max(adapter->rx_itr, adapter->tx_itr);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2582
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2583
	switch (current_itr) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2584
	/* 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
  2585
	case lowest_latency:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2586
		new_itr = 70000;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2587
		break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2588
	case low_latency:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2589
		new_itr = 20000; /* aka hwitr = ~200 */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2590
		break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2591
	case bulk_latency:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2592
		new_itr = 4000;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2593
		break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2594
	default:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2595
		break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2596
	}
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
set_itr_now:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2599
	if (new_itr != adapter->itr) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2600
		/* this attempts to bias the interrupt rate towards Bulk
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2601
		 * by adding intermediate steps when interrupt rate is
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2602
		 * increasing */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2603
		new_itr = new_itr > adapter->itr ?
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2604
		             min(adapter->itr + (new_itr >> 2), new_itr) :
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2605
		             new_itr;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2606
		adapter->itr = new_itr;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2607
		ew32(ITR, 1000000000 / (new_itr * 256));
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2608
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2609
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2610
	return;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2611
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2612
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2613
#define E1000_TX_FLAGS_CSUM		0x00000001
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2614
#define E1000_TX_FLAGS_VLAN		0x00000002
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2615
#define E1000_TX_FLAGS_TSO		0x00000004
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2616
#define E1000_TX_FLAGS_IPV4		0x00000008
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2617
#define E1000_TX_FLAGS_VLAN_MASK	0xffff0000
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2618
#define E1000_TX_FLAGS_VLAN_SHIFT	16
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2619
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2620
static int e1000_tso(struct e1000_adapter *adapter,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2621
		     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
  2622
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2623
	struct e1000_context_desc *context_desc;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2624
	struct e1000_buffer *buffer_info;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2625
	unsigned int i;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2626
	u32 cmd_length = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2627
	u16 ipcse = 0, tucse, mss;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2628
	u8 ipcss, ipcso, tucss, tucso, hdr_len;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2629
	int err;
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
	if (skb_is_gso(skb)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2632
		if (skb_header_cloned(skb)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2633
			err = pskb_expand_head(skb, 0, 0, GFP_ATOMIC);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2634
			if (err)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2635
				return err;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2636
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2637
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2638
		hdr_len = skb_transport_offset(skb) + tcp_hdrlen(skb);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2639
		mss = skb_shinfo(skb)->gso_size;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2640
		if (skb->protocol == htons(ETH_P_IP)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2641
			struct iphdr *iph = ip_hdr(skb);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2642
			iph->tot_len = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2643
			iph->check = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2644
			tcp_hdr(skb)->check = ~csum_tcpudp_magic(iph->saddr,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2645
								 iph->daddr, 0,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2646
								 IPPROTO_TCP,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2647
								 0);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2648
			cmd_length = E1000_TXD_CMD_IP;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2649
			ipcse = skb_transport_offset(skb) - 1;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2650
		} else if (skb->protocol == htons(ETH_P_IPV6)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2651
			ipv6_hdr(skb)->payload_len = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2652
			tcp_hdr(skb)->check =
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2653
				~csum_ipv6_magic(&ipv6_hdr(skb)->saddr,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2654
						 &ipv6_hdr(skb)->daddr,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2655
						 0, IPPROTO_TCP, 0);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2656
			ipcse = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2657
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2658
		ipcss = skb_network_offset(skb);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2659
		ipcso = (void *)&(ip_hdr(skb)->check) - (void *)skb->data;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2660
		tucss = skb_transport_offset(skb);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2661
		tucso = (void *)&(tcp_hdr(skb)->check) - (void *)skb->data;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2662
		tucse = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2663
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2664
		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
  2665
			       E1000_TXD_CMD_TCP | (skb->len - (hdr_len)));
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2666
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2667
		i = tx_ring->next_to_use;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2668
		context_desc = E1000_CONTEXT_DESC(*tx_ring, i);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2669
		buffer_info = &tx_ring->buffer_info[i];
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
		context_desc->lower_setup.ip_fields.ipcss  = ipcss;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2672
		context_desc->lower_setup.ip_fields.ipcso  = ipcso;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2673
		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
  2674
		context_desc->upper_setup.tcp_fields.tucss = tucss;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2675
		context_desc->upper_setup.tcp_fields.tucso = tucso;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2676
		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
  2677
		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
  2678
		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
  2679
		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
  2680
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2681
		buffer_info->time_stamp = jiffies;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2682
		buffer_info->next_to_watch = i;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2683
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2684
		if (++i == tx_ring->count) i = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2685
		tx_ring->next_to_use = i;
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
		return true;
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
	return false;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2690
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2691
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2692
static bool e1000_tx_csum(struct e1000_adapter *adapter,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2693
			  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
  2694
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2695
	struct e1000_context_desc *context_desc;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2696
	struct e1000_buffer *buffer_info;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2697
	unsigned int i;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2698
	u8 css;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2699
	u32 cmd_len = E1000_TXD_CMD_DEXT;
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
	if (skb->ip_summed != CHECKSUM_PARTIAL)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2702
		return false;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2703
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2704
	switch (skb->protocol) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2705
	case cpu_to_be16(ETH_P_IP):
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2706
		if (ip_hdr(skb)->protocol == IPPROTO_TCP)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2707
			cmd_len |= E1000_TXD_CMD_TCP;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2708
		break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2709
	case cpu_to_be16(ETH_P_IPV6):
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2710
		/* XXX not handling all IPV6 headers */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2711
		if (ipv6_hdr(skb)->nexthdr == IPPROTO_TCP)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2712
			cmd_len |= E1000_TXD_CMD_TCP;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2713
		break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2714
	default:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2715
		if (unlikely(net_ratelimit()))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2716
			DPRINTK(DRV, WARNING,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2717
			        "checksum_partial proto=%x!\n", skb->protocol);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2718
		break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2719
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2720
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2721
	css = skb_transport_offset(skb);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2722
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2723
	i = tx_ring->next_to_use;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2724
	buffer_info = &tx_ring->buffer_info[i];
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2725
	context_desc = E1000_CONTEXT_DESC(*tx_ring, i);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2726
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2727
	context_desc->lower_setup.ip_config = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2728
	context_desc->upper_setup.tcp_fields.tucss = css;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2729
	context_desc->upper_setup.tcp_fields.tucso =
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2730
		css + skb->csum_offset;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2731
	context_desc->upper_setup.tcp_fields.tucse = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2732
	context_desc->tcp_seg_setup.data = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2733
	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
  2734
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2735
	buffer_info->time_stamp = jiffies;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2736
	buffer_info->next_to_watch = i;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2737
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2738
	if (unlikely(++i == tx_ring->count)) i = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2739
	tx_ring->next_to_use = i;
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
	return true;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2742
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2743
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2744
#define E1000_MAX_TXD_PWR	12
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2745
#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
  2746
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2747
static int e1000_tx_map(struct e1000_adapter *adapter,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2748
			struct e1000_tx_ring *tx_ring,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2749
			struct sk_buff *skb, unsigned int first,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2750
			unsigned int max_per_txd, unsigned int nr_frags,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2751
			unsigned int mss)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2752
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2753
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2754
	struct pci_dev *pdev = adapter->pdev;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2755
	struct e1000_buffer *buffer_info;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2756
	unsigned int len = skb_headlen(skb);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2757
	unsigned int offset = 0, size, count = 0, i;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2758
	unsigned int f;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2759
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2760
	i = tx_ring->next_to_use;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2761
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2762
	while (len) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2763
		buffer_info = &tx_ring->buffer_info[i];
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2764
		size = min(len, max_per_txd);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2765
		/* Workaround for Controller erratum --
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2766
		 * 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
  2767
		 * 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
  2768
		 * DMA'd to the controller */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2769
		if (!skb->data_len && tx_ring->last_tx_tso &&
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2770
		    !skb_is_gso(skb)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2771
			tx_ring->last_tx_tso = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2772
			size -= 4;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2773
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2774
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2775
		/* Workaround for premature desc write-backs
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2776
		 * in TSO mode.  Append 4-byte sentinel desc */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2777
		if (unlikely(mss && !nr_frags && size == len && size > 8))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2778
			size -= 4;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2779
		/* work-around for errata 10 and it applies
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2780
		 * to all controllers in PCI-X mode
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2781
		 * 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
  2782
		 * 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
  2783
		 */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2784
		if (unlikely((hw->bus_type == e1000_bus_type_pcix) &&
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2785
		                (size > 2015) && count == 0))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2786
		        size = 2015;
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
		/* Workaround for potential 82544 hang in PCI-X.  Avoid
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2789
		 * terminating buffers within evenly-aligned dwords. */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2790
		if (unlikely(adapter->pcix_82544 &&
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2791
		   !((unsigned long)(skb->data + offset + size - 1) & 4) &&
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2792
		   size > 4))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2793
			size -= 4;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2794
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2795
		buffer_info->length = size;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2796
		/* 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
  2797
		buffer_info->time_stamp = jiffies;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2798
		buffer_info->mapped_as_page = false;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2799
		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
  2800
						  size,	PCI_DMA_TODEVICE);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2801
		if (pci_dma_mapping_error(pdev, buffer_info->dma))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2802
			goto dma_error;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2803
		buffer_info->next_to_watch = i;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2804
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2805
		len -= size;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2806
		offset += size;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2807
		count++;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2808
		if (len) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2809
			i++;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2810
			if (unlikely(i == tx_ring->count))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2811
				i = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2812
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2813
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2814
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2815
	for (f = 0; f < nr_frags; f++) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2816
		struct skb_frag_struct *frag;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2817
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2818
		frag = &skb_shinfo(skb)->frags[f];
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2819
		len = frag->size;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2820
		offset = frag->page_offset;
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
		while (len) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2823
			i++;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2824
			if (unlikely(i == tx_ring->count))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2825
				i = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2826
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2827
			buffer_info = &tx_ring->buffer_info[i];
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2828
			size = min(len, max_per_txd);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2829
			/* Workaround for premature desc write-backs
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2830
			 * in TSO mode.  Append 4-byte sentinel desc */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2831
			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
  2832
				size -= 4;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2833
			/* Workaround for potential 82544 hang in PCI-X.
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2834
			 * Avoid terminating buffers within evenly-aligned
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2835
			 * dwords. */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2836
			if (unlikely(adapter->pcix_82544 &&
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2837
			    !((unsigned long)(page_to_phys(frag->page) + offset
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2838
			                      + size - 1) & 4) &&
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2839
			    size > 4))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2840
				size -= 4;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2841
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2842
			buffer_info->length = size;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2843
			buffer_info->time_stamp = jiffies;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2844
			buffer_info->mapped_as_page = true;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2845
			buffer_info->dma = pci_map_page(pdev, frag->page,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2846
							offset,	size,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2847
							PCI_DMA_TODEVICE);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2848
			if (pci_dma_mapping_error(pdev, buffer_info->dma))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2849
				goto dma_error;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2850
			buffer_info->next_to_watch = i;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2851
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2852
			len -= size;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2853
			offset += size;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2854
			count++;
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
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2857
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2858
	tx_ring->buffer_info[i].skb = skb;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2859
	tx_ring->buffer_info[first].next_to_watch = i;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2860
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2861
	return count;
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
dma_error:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2864
	dev_err(&pdev->dev, "TX DMA map failed\n");
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2865
	buffer_info->dma = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2866
	if (count)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2867
		count--;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2868
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2869
	while (count--) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2870
		if (i==0)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2871
			i += tx_ring->count;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2872
		i--;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2873
		buffer_info = &tx_ring->buffer_info[i];
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2874
		e1000_unmap_and_free_tx_resource(adapter, buffer_info);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2875
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2876
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2877
	return 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2878
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2879
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2880
static void e1000_tx_queue(struct e1000_adapter *adapter,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2881
			   struct e1000_tx_ring *tx_ring, int tx_flags,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2882
			   int count)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2883
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2884
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2885
	struct e1000_tx_desc *tx_desc = NULL;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2886
	struct e1000_buffer *buffer_info;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2887
	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
  2888
	unsigned int i;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2889
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2890
	if (likely(tx_flags & E1000_TX_FLAGS_TSO)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2891
		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
  2892
		             E1000_TXD_CMD_TSE;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2893
		txd_upper |= E1000_TXD_POPTS_TXSM << 8;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2894
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2895
		if (likely(tx_flags & E1000_TX_FLAGS_IPV4))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2896
			txd_upper |= E1000_TXD_POPTS_IXSM << 8;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2897
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2898
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2899
	if (likely(tx_flags & E1000_TX_FLAGS_CSUM)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2900
		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
  2901
		txd_upper |= E1000_TXD_POPTS_TXSM << 8;
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
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2904
	if (unlikely(tx_flags & E1000_TX_FLAGS_VLAN)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2905
		txd_lower |= E1000_TXD_CMD_VLE;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2906
		txd_upper |= (tx_flags & E1000_TX_FLAGS_VLAN_MASK);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2907
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2908
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2909
	i = tx_ring->next_to_use;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2910
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2911
	while (count--) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2912
		buffer_info = &tx_ring->buffer_info[i];
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2913
		tx_desc = E1000_TX_DESC(*tx_ring, i);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2914
		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
  2915
		tx_desc->lower.data =
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2916
			cpu_to_le32(txd_lower | buffer_info->length);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2917
		tx_desc->upper.data = cpu_to_le32(txd_upper);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2918
		if (unlikely(++i == tx_ring->count)) i = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2919
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2920
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2921
	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
  2922
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2923
	/* Force memory writes to complete before letting h/w
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2924
	 * know there are new descriptors to fetch.  (Only
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2925
	 * applicable for weak-ordered memory model archs,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2926
	 * such as IA-64). */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2927
	wmb();
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2928
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2929
	tx_ring->next_to_use = i;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2930
	writel(i, hw->hw_addr + tx_ring->tdt);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2931
	/* 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
  2932
	 * 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
  2933
	mmiowb();
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
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2936
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2937
 * 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
  2938
 * 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
  2939
 * 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
  2940
 * 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
  2941
 * 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
  2942
 * to the beginning of the Tx FIFO.
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2943
 **/
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2944
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2945
#define E1000_FIFO_HDR			0x10
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2946
#define E1000_82547_PAD_LEN		0x3E0
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
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
  2949
				       struct sk_buff *skb)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2950
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2951
	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
  2952
	u32 skb_fifo_len = skb->len + E1000_FIFO_HDR;
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
	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
  2955
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2956
	if (adapter->link_duplex != HALF_DUPLEX)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2957
		goto no_fifo_stall_required;
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
	if (atomic_read(&adapter->tx_fifo_stall))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2960
		return 1;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2961
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2962
	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
  2963
		atomic_set(&adapter->tx_fifo_stall, 1);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2964
		return 1;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2965
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2966
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2967
no_fifo_stall_required:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2968
	adapter->tx_fifo_head += skb_fifo_len;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2969
	if (adapter->tx_fifo_head >= adapter->tx_fifo_size)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2970
		adapter->tx_fifo_head -= adapter->tx_fifo_size;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2971
	return 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2972
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2973
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2974
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
  2975
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2976
	struct e1000_adapter *adapter = netdev_priv(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2977
	struct e1000_tx_ring *tx_ring = adapter->tx_ring;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2978
2589
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2209
diff changeset
  2979
	if (adapter->ecdev) {
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2209
diff changeset
  2980
		return -EBUSY;
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2209
diff changeset
  2981
	}
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2209
diff changeset
  2982
1992
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2983
	netif_stop_queue(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2984
	/* Herbert's original patch had:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2985
	 *  smp_mb__after_netif_stop_queue();
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2986
	 * 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
  2987
	smp_mb();
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2988
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2989
	/* 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
  2990
	 * made room available. */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2991
	if (likely(E1000_DESC_UNUSED(tx_ring) < size))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2992
		return -EBUSY;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2993
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2994
	/* A reprieve! */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2995
	netif_start_queue(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2996
	++adapter->restart_queue;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  2997
	return 0;
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
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
  3001
                               struct e1000_tx_ring *tx_ring, int size)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3002
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3003
	if (likely(E1000_DESC_UNUSED(tx_ring) >= size))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3004
		return 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3005
	return __e1000_maybe_stop_tx(netdev, size);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3006
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3007
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3008
#define TXD_USE_COUNT(S, X) (((S) >> (X)) + 1 )
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3009
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
  3010
				    struct net_device *netdev)
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
	struct e1000_adapter *adapter = netdev_priv(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3013
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3014
	struct e1000_tx_ring *tx_ring;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3015
	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
  3016
	unsigned int max_txd_pwr = E1000_MAX_TXD_PWR;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3017
	unsigned int tx_flags = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3018
	unsigned int len = skb->len - skb->data_len;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3019
	unsigned int nr_frags = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3020
	unsigned int mss = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3021
	int count = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3022
	int tso;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3023
	unsigned int f;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3024
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3025
	/* 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
  3026
	 * 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
  3027
	 * 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
  3028
	 * single qdisc implementation, we can look at this again. */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3029
	tx_ring = adapter->tx_ring;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3030
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3031
	if (unlikely(skb->len <= 0)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3032
		if (!adapter->ecdev)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3033
			dev_kfree_skb_any(skb);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3034
		return NETDEV_TX_OK;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3035
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3036
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3037
	mss = skb_shinfo(skb)->gso_size;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3038
	/* The controller does a simple calculation to
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3039
	 * 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
  3040
	 * initiating the DMA for each buffer.  The calc is:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3041
	 * 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
  3042
	 * 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
  3043
	 * drops. */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3044
	if (mss) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3045
		u8 hdr_len;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3046
		max_per_txd = min(mss << 2, max_per_txd);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3047
		max_txd_pwr = fls(max_per_txd) - 1;
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
		hdr_len = skb_transport_offset(skb) + tcp_hdrlen(skb);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3050
		if (skb->data_len && hdr_len == len) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3051
			switch (hw->mac_type) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3052
				unsigned int pull_size;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3053
			case e1000_82544:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3054
				/* 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
  3055
				 * and that the end alignment will work out to
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3056
				 * this hardware's requirements
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3057
				 * NOTE: this is a TSO only workaround
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3058
				 * if end byte alignment not correct move us
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3059
				 * into the next dword */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3060
				if ((unsigned long)(skb_tail_pointer(skb) - 1) & 4)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3061
					break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3062
				/* fall through */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3063
				pull_size = min((unsigned int)4, skb->data_len);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3064
				if (!__pskb_pull_tail(skb, pull_size)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3065
					DPRINTK(DRV, ERR,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3066
						"__pskb_pull_tail failed.\n");
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3067
					dev_kfree_skb_any(skb);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3068
					return NETDEV_TX_OK;
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
				len = skb->len - skb->data_len;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3071
				break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3072
			default:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3073
				/* do nothing */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3074
				break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3075
			}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3076
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3077
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3078
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3079
	/* reserve a descriptor for the offload context */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3080
	if ((mss) || (skb->ip_summed == CHECKSUM_PARTIAL))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3081
		count++;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3082
	count++;
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
	/* Controller Erratum workaround */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3085
	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
  3086
		count++;
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
	count += TXD_USE_COUNT(len, max_txd_pwr);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3089
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3090
	if (adapter->pcix_82544)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3091
		count++;
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
	/* 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
  3094
	 * 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
  3095
	 */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3096
	if (unlikely((hw->bus_type == e1000_bus_type_pcix) &&
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3097
			(len > 2015)))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3098
		count++;
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
	nr_frags = skb_shinfo(skb)->nr_frags;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3101
	for (f = 0; f < nr_frags; f++)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3102
		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
  3103
				       max_txd_pwr);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3104
	if (adapter->pcix_82544)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3105
		count += nr_frags;
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
	/* 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
  3108
	 * head, otherwise try next time */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3109
	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
  3110
		return NETDEV_TX_BUSY;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3111
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3112
	if (unlikely(hw->mac_type == e1000_82547)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3113
		if (unlikely(e1000_82547_fifo_workaround(adapter, skb))) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3114
			if (!adapter->ecdev) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3115
				netif_stop_queue(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3116
				if (!test_bit(__E1000_DOWN, &adapter->flags))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3117
					mod_timer(&adapter->tx_fifo_stall_timer,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3118
					          jiffies + 1);
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
			return NETDEV_TX_BUSY;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3121
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3122
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3123
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3124
	if (unlikely(adapter->vlgrp && vlan_tx_tag_present(skb))) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3125
		tx_flags |= E1000_TX_FLAGS_VLAN;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3126
		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
  3127
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3128
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3129
	first = tx_ring->next_to_use;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3130
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3131
	tso = e1000_tso(adapter, tx_ring, skb);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3132
	if (tso < 0) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3133
		if (!adapter->ecdev) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3134
			dev_kfree_skb_any(skb);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3135
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3136
		return NETDEV_TX_OK;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3137
	}
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
	if (likely(tso)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3140
		if (likely(hw->mac_type != e1000_82544))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3141
			tx_ring->last_tx_tso = 1;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3142
		tx_flags |= E1000_TX_FLAGS_TSO;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3143
	} 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
  3144
		tx_flags |= E1000_TX_FLAGS_CSUM;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3145
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3146
	if (likely(skb->protocol == htons(ETH_P_IP)))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3147
		tx_flags |= E1000_TX_FLAGS_IPV4;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3148
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3149
	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
  3150
	                     nr_frags, mss);
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
	if (count) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3153
		e1000_tx_queue(adapter, tx_ring, tx_flags, count);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3154
		if (!adapter->ecdev) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3155
			/* 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
  3156
			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
  3157
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3158
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3159
	} else {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3160
		if (!adapter->ecdev) dev_kfree_skb_any(skb);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3161
		tx_ring->buffer_info[first].time_stamp = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3162
		tx_ring->next_to_use = first;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3163
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3164
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3165
	return NETDEV_TX_OK;
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
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3168
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3169
 * e1000_tx_timeout - Respond to a Tx Hang
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3170
 * @netdev: network interface device structure
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3171
 **/
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3172
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3173
static void e1000_tx_timeout(struct net_device *netdev)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3174
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3175
	struct e1000_adapter *adapter = netdev_priv(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3176
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3177
	/* Do the reset outside of interrupt context */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3178
	adapter->tx_timeout_count++;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3179
	schedule_work(&adapter->reset_task);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3180
}
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
static void e1000_reset_task(struct work_struct *work)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3183
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3184
	struct e1000_adapter *adapter =
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3185
		container_of(work, struct e1000_adapter, reset_task);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3186
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3187
	e1000_reinit_locked(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3188
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3189
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
 * e1000_get_stats - Get System Network Statistics
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3192
 * @netdev: network interface device structure
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3193
 *
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3194
 * Returns the address of the device statistics structure.
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3195
 * The statistics are actually updated from the timer callback.
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
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3198
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
  3199
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3200
	/* only return the current stats */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3201
	return &netdev->stats;
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
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3204
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3205
 * e1000_change_mtu - Change the Maximum Transfer Unit
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3206
 * @netdev: network interface device structure
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3207
 * @new_mtu: new value for maximum frame size
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
 * Returns 0 on success, negative on failure
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
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
  3213
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3214
	struct e1000_adapter *adapter = netdev_priv(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3215
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3216
	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
  3217
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3218
	if (adapter->ecdev)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3219
		return -EBUSY;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3220
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3221
	if ((max_frame < MINIMUM_ETHERNET_FRAME_SIZE) ||
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3222
	    (max_frame > MAX_JUMBO_FRAME_SIZE)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3223
		DPRINTK(PROBE, ERR, "Invalid MTU setting\n");
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3224
		return -EINVAL;
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-specific max frame size limits. */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3228
	switch (hw->mac_type) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3229
	case e1000_undefined ... e1000_82542_rev2_1:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3230
		if (max_frame > (ETH_FRAME_LEN + ETH_FCS_LEN)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3231
			DPRINTK(PROBE, ERR, "Jumbo Frames not supported.\n");
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3232
			return -EINVAL;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3233
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3234
		break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3235
	default:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3236
		/* 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
  3237
		break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3238
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3239
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3240
	while (test_and_set_bit(__E1000_RESETTING, &adapter->flags))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3241
		msleep(1);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3242
	/* e1000_down has a dependency on max_frame_size */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3243
	hw->max_frame_size = max_frame;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3244
	if (netif_running(netdev))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3245
		e1000_down(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3246
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3247
	/* 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
  3248
	 * 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
  3249
	 * larger slab size.
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3250
	 * i.e. RXBUFFER_2048 --> size-4096 slab
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3251
	 *  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
  3252
	 *  fragmented skbs */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3253
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3254
	if (max_frame <= E1000_RXBUFFER_2048)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3255
		adapter->rx_buffer_len = E1000_RXBUFFER_2048;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3256
	else
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3257
#if (PAGE_SIZE >= E1000_RXBUFFER_16384)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3258
		adapter->rx_buffer_len = E1000_RXBUFFER_16384;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3259
#elif (PAGE_SIZE >= E1000_RXBUFFER_4096)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3260
		adapter->rx_buffer_len = PAGE_SIZE;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3261
#endif
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3262
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3263
	/* 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
  3264
	if (!hw->tbi_compatibility_on &&
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3265
	    ((max_frame == (ETH_FRAME_LEN + ETH_FCS_LEN)) ||
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3266
	     (max_frame == MAXIMUM_ETHERNET_VLAN_SIZE)))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3267
		adapter->rx_buffer_len = MAXIMUM_ETHERNET_VLAN_SIZE;
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
	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
  3270
	       netdev->name, netdev->mtu, new_mtu);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3271
	netdev->mtu = new_mtu;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3272
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3273
	if (netif_running(netdev))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3274
		e1000_up(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3275
	else
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3276
		e1000_reset(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3277
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3278
	clear_bit(__E1000_RESETTING, &adapter->flags);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3279
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3280
	return 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3281
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3282
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3283
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3284
 * e1000_update_stats - Update the board statistics counters
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3285
 * @adapter: board private structure
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3286
 **/
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3287
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3288
void e1000_update_stats(struct e1000_adapter *adapter)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3289
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3290
	struct net_device *netdev = adapter->netdev;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3291
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3292
	struct pci_dev *pdev = adapter->pdev;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3293
	unsigned long flags = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3294
	u16 phy_tmp;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3295
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3296
#define PHY_IDLE_ERROR_COUNT_MASK 0x00FF
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3297
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
	 * 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
  3300
	 * connection is down.
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3301
	 */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3302
	if (adapter->link_speed == 0)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3303
		return;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3304
	if (pci_channel_offline(pdev))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3305
		return;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3306
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3307
	if (!adapter->ecdev)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3308
		spin_lock_irqsave(&adapter->stats_lock, flags);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3309
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3310
	/* these counters are modified from e1000_tbi_adjust_stats,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3311
	 * called from the interrupt context, so they must only
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3312
	 * be written while holding adapter->stats_lock
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3313
	 */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3314
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3315
	adapter->stats.crcerrs += er32(CRCERRS);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3316
	adapter->stats.gprc += er32(GPRC);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3317
	adapter->stats.gorcl += er32(GORCL);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3318
	adapter->stats.gorch += er32(GORCH);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3319
	adapter->stats.bprc += er32(BPRC);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3320
	adapter->stats.mprc += er32(MPRC);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3321
	adapter->stats.roc += er32(ROC);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3322
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3323
	adapter->stats.prc64 += er32(PRC64);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3324
	adapter->stats.prc127 += er32(PRC127);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3325
	adapter->stats.prc255 += er32(PRC255);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3326
	adapter->stats.prc511 += er32(PRC511);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3327
	adapter->stats.prc1023 += er32(PRC1023);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3328
	adapter->stats.prc1522 += er32(PRC1522);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3329
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3330
	adapter->stats.symerrs += er32(SYMERRS);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3331
	adapter->stats.mpc += er32(MPC);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3332
	adapter->stats.scc += er32(SCC);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3333
	adapter->stats.ecol += er32(ECOL);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3334
	adapter->stats.mcc += er32(MCC);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3335
	adapter->stats.latecol += er32(LATECOL);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3336
	adapter->stats.dc += er32(DC);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3337
	adapter->stats.sec += er32(SEC);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3338
	adapter->stats.rlec += er32(RLEC);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3339
	adapter->stats.xonrxc += er32(XONRXC);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3340
	adapter->stats.xontxc += er32(XONTXC);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3341
	adapter->stats.xoffrxc += er32(XOFFRXC);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3342
	adapter->stats.xofftxc += er32(XOFFTXC);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3343
	adapter->stats.fcruc += er32(FCRUC);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3344
	adapter->stats.gptc += er32(GPTC);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3345
	adapter->stats.gotcl += er32(GOTCL);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3346
	adapter->stats.gotch += er32(GOTCH);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3347
	adapter->stats.rnbc += er32(RNBC);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3348
	adapter->stats.ruc += er32(RUC);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3349
	adapter->stats.rfc += er32(RFC);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3350
	adapter->stats.rjc += er32(RJC);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3351
	adapter->stats.torl += er32(TORL);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3352
	adapter->stats.torh += er32(TORH);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3353
	adapter->stats.totl += er32(TOTL);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3354
	adapter->stats.toth += er32(TOTH);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3355
	adapter->stats.tpr += er32(TPR);
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
	adapter->stats.ptc64 += er32(PTC64);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3358
	adapter->stats.ptc127 += er32(PTC127);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3359
	adapter->stats.ptc255 += er32(PTC255);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3360
	adapter->stats.ptc511 += er32(PTC511);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3361
	adapter->stats.ptc1023 += er32(PTC1023);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3362
	adapter->stats.ptc1522 += er32(PTC1522);
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
	adapter->stats.mptc += er32(MPTC);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3365
	adapter->stats.bptc += er32(BPTC);
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
	/* used for adaptive IFS */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3368
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3369
	hw->tx_packet_delta = er32(TPT);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3370
	adapter->stats.tpt += hw->tx_packet_delta;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3371
	hw->collision_delta = er32(COLC);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3372
	adapter->stats.colc += hw->collision_delta;
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
	if (hw->mac_type >= e1000_82543) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3375
		adapter->stats.algnerrc += er32(ALGNERRC);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3376
		adapter->stats.rxerrc += er32(RXERRC);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3377
		adapter->stats.tncrs += er32(TNCRS);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3378
		adapter->stats.cexterr += er32(CEXTERR);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3379
		adapter->stats.tsctc += er32(TSCTC);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3380
		adapter->stats.tsctfc += er32(TSCTFC);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3381
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3382
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3383
	/* Fill out the OS statistics structure */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3384
	netdev->stats.multicast = adapter->stats.mprc;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3385
	netdev->stats.collisions = adapter->stats.colc;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3386
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3387
	/* Rx Errors */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3388
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3389
	/* 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
  3390
	* our own version based on RUC and ROC */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3391
	netdev->stats.rx_errors = adapter->stats.rxerrc +
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3392
		adapter->stats.crcerrs + adapter->stats.algnerrc +
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3393
		adapter->stats.ruc + adapter->stats.roc +
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3394
		adapter->stats.cexterr;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3395
	adapter->stats.rlerrc = adapter->stats.ruc + adapter->stats.roc;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3396
	netdev->stats.rx_length_errors = adapter->stats.rlerrc;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3397
	netdev->stats.rx_crc_errors = adapter->stats.crcerrs;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3398
	netdev->stats.rx_frame_errors = adapter->stats.algnerrc;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3399
	netdev->stats.rx_missed_errors = adapter->stats.mpc;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3400
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3401
	/* Tx Errors */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3402
	adapter->stats.txerrc = adapter->stats.ecol + adapter->stats.latecol;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3403
	netdev->stats.tx_errors = adapter->stats.txerrc;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3404
	netdev->stats.tx_aborted_errors = adapter->stats.ecol;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3405
	netdev->stats.tx_window_errors = adapter->stats.latecol;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3406
	netdev->stats.tx_carrier_errors = adapter->stats.tncrs;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3407
	if (hw->bad_tx_carr_stats_fd &&
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3408
	    adapter->link_duplex == FULL_DUPLEX) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3409
		netdev->stats.tx_carrier_errors = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3410
		adapter->stats.tncrs = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3411
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3412
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3413
	/* Tx Dropped needs to be maintained elsewhere */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3414
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3415
	/* Phy Stats */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3416
	if (hw->media_type == e1000_media_type_copper) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3417
		if ((adapter->link_speed == SPEED_1000) &&
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3418
		   (!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
  3419
			phy_tmp &= PHY_IDLE_ERROR_COUNT_MASK;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3420
			adapter->phy_stats.idle_errors += phy_tmp;
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
		if ((hw->mac_type <= e1000_82546) &&
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3424
		   (hw->phy_type == e1000_phy_m88) &&
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3425
		   !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
  3426
			adapter->phy_stats.receive_errors += phy_tmp;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3427
	}
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
	/* Management Stats */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3430
	if (hw->has_smbus) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3431
		adapter->stats.mgptc += er32(MGTPTC);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3432
		adapter->stats.mgprc += er32(MGTPRC);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3433
		adapter->stats.mgpdc += er32(MGTPDC);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3434
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3435
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3436
	if (!adapter->ecdev)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3437
		spin_unlock_irqrestore(&adapter->stats_lock, flags);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3438
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3439
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3440
void ec_poll(struct net_device *netdev)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3441
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3442
	struct e1000_adapter *adapter = netdev_priv(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3443
	if (jiffies - adapter->ec_watchdog_jiffies >= 2 * HZ) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3444
		e1000_watchdog((unsigned long) adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3445
		adapter->ec_watchdog_jiffies = jiffies;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3446
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3447
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3448
	e1000_intr(0, netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3449
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3450
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3451
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3452
 * e1000_intr - Interrupt Handler
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3453
 * @irq: interrupt number
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3454
 * @data: pointer to a network interface device structure
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3455
 **/
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3456
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3457
static irqreturn_t e1000_intr(int irq, void *data)
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
	struct net_device *netdev = data;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3460
	struct e1000_adapter *adapter = netdev_priv(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3461
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3462
	u32 icr = er32(ICR);
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
	if (unlikely((!icr) || test_bit(__E1000_DOWN, &adapter->flags)))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3465
		return IRQ_NONE;  /* Not our interrupt */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3466
2208
5c14d0512362 Minor spacing changes.
Florian Pose <fp@igh-essen.com>
parents: 2206
diff changeset
  3467
	if (unlikely(icr & (E1000_ICR_RXSEQ | E1000_ICR_LSC))) {
1992
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3468
		hw->get_link_status = 1;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3469
		/* guard against interrupt when we're going down */
2209
b6c4c8940d0a Fixed e1000 link detection race.
Florian Pose <fp@igh-essen.com>
parents: 2208
diff changeset
  3470
		if (!adapter->ecdev && !test_bit(__E1000_DOWN, &adapter->flags))
1992
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3471
			mod_timer(&adapter->watchdog_timer, jiffies + 1);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3472
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3473
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3474
	if (adapter->ecdev) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3475
		int i, ec_work_done = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3476
		for (i = 0; i < E1000_MAX_INTR; i++) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3477
			if (unlikely(!adapter->clean_rx(adapter, adapter->rx_ring,
2163
d6d49dcaf7a5 Fixed accidentially used operator & by using &&.
Florian Pose <fp@igh-essen.com>
parents: 2033
diff changeset
  3478
							&ec_work_done, 100) &&
1992
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3479
						!e1000_clean_tx_irq(adapter, adapter->tx_ring))) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3480
				break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3481
			}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3482
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3483
	} else {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3484
		/* disable interrupts, without the synchronize_irq bit */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3485
		ew32(IMC, ~0);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3486
		E1000_WRITE_FLUSH();
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3487
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3488
		if (likely(napi_schedule_prep(&adapter->napi))) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3489
			adapter->total_tx_bytes = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3490
			adapter->total_tx_packets = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3491
			adapter->total_rx_bytes = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3492
			adapter->total_rx_packets = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3493
			__napi_schedule(&adapter->napi);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3494
		} else {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3495
			/* 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
  3496
			 * 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
  3497
			if (!test_bit(__E1000_DOWN, &adapter->flags))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3498
				e1000_irq_enable(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3499
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3500
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3501
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3502
	return IRQ_HANDLED;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3503
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3504
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3505
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3506
 * e1000_clean - NAPI Rx polling callback
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3507
 * @adapter: board private structure
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3508
 * EtherCAT: never called
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3509
 **/
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3510
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
  3511
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3512
	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
  3513
	int tx_clean_complete = 0, work_done = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3514
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3515
	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
  3516
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3517
	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
  3518
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3519
	if (!tx_clean_complete)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3520
		work_done = budget;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3521
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3522
	/* If budget not fully consumed, exit the polling mode */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3523
	if (work_done < budget) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3524
		if (likely(adapter->itr_setting & 3))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3525
			e1000_set_itr(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3526
		napi_complete(napi);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3527
		if (!test_bit(__E1000_DOWN, &adapter->flags))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3528
			e1000_irq_enable(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3529
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3530
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3531
	return work_done;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3532
}
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
 * e1000_clean_tx_irq - Reclaim resources after transmit completes
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3536
 * @adapter: board private structure
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
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
  3539
			       struct e1000_tx_ring *tx_ring)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3540
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3541
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3542
	struct net_device *netdev = adapter->netdev;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3543
	struct e1000_tx_desc *tx_desc, *eop_desc;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3544
	struct e1000_buffer *buffer_info;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3545
	unsigned int i, eop;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3546
	unsigned int count = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3547
	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
  3548
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3549
	i = tx_ring->next_to_clean;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3550
	eop = tx_ring->buffer_info[i].next_to_watch;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3551
	eop_desc = E1000_TX_DESC(*tx_ring, eop);
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
	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
  3554
	       (count < tx_ring->count)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3555
		bool cleaned = false;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3556
		for ( ; !cleaned; count++) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3557
			tx_desc = E1000_TX_DESC(*tx_ring, i);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3558
			buffer_info = &tx_ring->buffer_info[i];
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3559
			cleaned = (i == eop);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3560
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3561
			if (cleaned) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3562
				struct sk_buff *skb = buffer_info->skb;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3563
				unsigned int segs, bytecount;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3564
				segs = skb_shinfo(skb)->gso_segs ?: 1;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3565
				/* multiply data chunks by size of headers */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3566
				bytecount = ((segs - 1) * skb_headlen(skb)) +
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3567
				            skb->len;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3568
				total_tx_packets += segs;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3569
				total_tx_bytes += bytecount;
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
			e1000_unmap_and_free_tx_resource(adapter, buffer_info);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3572
			tx_desc->upper.data = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3573
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3574
			if (unlikely(++i == tx_ring->count)) i = 0;
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
		eop = tx_ring->buffer_info[i].next_to_watch;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3578
		eop_desc = E1000_TX_DESC(*tx_ring, eop);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3579
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3580
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3581
	tx_ring->next_to_clean = i;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3582
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3583
#define TX_WAKE_THRESHOLD 32
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3584
	if (!adapter->ecdev && unlikely(count && netif_carrier_ok(netdev) &&
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3585
		     E1000_DESC_UNUSED(tx_ring) >= TX_WAKE_THRESHOLD)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3586
		/* Make sure that anybody stopping the queue after this
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3587
		 * sees the new next_to_clean.
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3588
		 */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3589
		smp_mb();
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3590
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3591
		if (netif_queue_stopped(netdev) &&
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3592
		    !(test_bit(__E1000_DOWN, &adapter->flags))) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3593
			netif_wake_queue(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3594
			++adapter->restart_queue;
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
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3598
	if (!adapter->ecdev && adapter->detect_tx_hung) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3599
		/* Detect a transmit hang in hardware, this serializes the
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3600
		 * 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
  3601
		adapter->detect_tx_hung = false;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3602
		if (tx_ring->buffer_info[eop].time_stamp &&
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3603
		    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
  3604
		               (adapter->tx_timeout_factor * HZ)) &&
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3605
		    !(er32(STATUS) & E1000_STATUS_TXOFF)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3606
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3607
			/* detected Tx unit hang */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3608
			DPRINTK(DRV, ERR, "Detected Tx Unit Hang\n"
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3609
					"  Tx Queue             <%lu>\n"
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3610
					"  TDH                  <%x>\n"
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3611
					"  TDT                  <%x>\n"
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3612
					"  next_to_use          <%x>\n"
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3613
					"  next_to_clean        <%x>\n"
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3614
					"buffer_info[next_to_clean]\n"
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3615
					"  time_stamp           <%lx>\n"
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3616
					"  next_to_watch        <%x>\n"
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3617
					"  jiffies              <%lx>\n"
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3618
					"  next_to_watch.status <%x>\n",
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3619
				(unsigned long)((tx_ring - adapter->tx_ring) /
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3620
					sizeof(struct e1000_tx_ring)),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3621
				readl(hw->hw_addr + tx_ring->tdh),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3622
				readl(hw->hw_addr + tx_ring->tdt),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3623
				tx_ring->next_to_use,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3624
				tx_ring->next_to_clean,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3625
				tx_ring->buffer_info[eop].time_stamp,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3626
				eop,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3627
				jiffies,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3628
				eop_desc->upper.fields.status);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3629
			netif_stop_queue(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3630
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3631
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3632
	adapter->total_tx_bytes += total_tx_bytes;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3633
	adapter->total_tx_packets += total_tx_packets;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3634
	netdev->stats.tx_bytes += total_tx_bytes;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3635
	netdev->stats.tx_packets += total_tx_packets;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3636
	return (count < tx_ring->count);
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
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3639
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3640
 * e1000_rx_checksum - Receive Checksum Offload for 82543
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3641
 * @adapter:     board private structure
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3642
 * @status_err:  receive descriptor status and error fields
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3643
 * @csum:        receive descriptor csum field
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3644
 * @sk_buff:     socket buffer with received data
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3645
 **/
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3646
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3647
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
  3648
			      u32 csum, struct sk_buff *skb)
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
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3651
	u16 status = (u16)status_err;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3652
	u8 errors = (u8)(status_err >> 24);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3653
	skb->ip_summed = CHECKSUM_NONE;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3654
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3655
	/* 82543 or newer only */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3656
	if (unlikely(hw->mac_type < e1000_82543)) return;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3657
	/* Ignore Checksum bit is set */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3658
	if (unlikely(status & E1000_RXD_STAT_IXSM)) return;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3659
	/* TCP/UDP checksum error bit is set */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3660
	if (unlikely(errors & E1000_RXD_ERR_TCPE)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3661
		/* let the stack verify checksum errors */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3662
		adapter->hw_csum_err++;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3663
		return;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3664
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3665
	/* TCP/UDP Checksum has not been calculated */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3666
	if (!(status & E1000_RXD_STAT_TCPCS))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3667
		return;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3668
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3669
	/* 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
  3670
	if (likely(status & E1000_RXD_STAT_TCPCS)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3671
		/* TCP checksum is good */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3672
		skb->ip_summed = CHECKSUM_UNNECESSARY;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3673
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3674
	adapter->hw_csum_good++;
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
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3678
 * e1000_consume_page - helper function
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3679
 **/
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3680
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
  3681
                               u16 length)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3682
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3683
	bi->page = NULL;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3684
	skb->len += length;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3685
	skb->data_len += length;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3686
	skb->truesize += length;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3687
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3688
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3689
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3690
 * e1000_receive_skb - helper function to handle rx indications
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3691
 * @adapter: board private structure
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3692
 * @status: descriptor status field as written by hardware
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3693
 * @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
  3694
 * @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
  3695
 */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3696
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
  3697
			      __le16 vlan, struct sk_buff *skb)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3698
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3699
	if (unlikely(adapter->vlgrp && (status & E1000_RXD_STAT_VP))) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3700
		vlan_hwaccel_receive_skb(skb, adapter->vlgrp,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3701
		                         le16_to_cpu(vlan) &
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3702
		                         E1000_RXD_SPC_VLAN_MASK);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3703
	} else {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3704
		netif_receive_skb(skb);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3705
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3706
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3707
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3708
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3709
 * 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
  3710
 * @adapter: board private structure
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3711
 * @rx_ring: ring to clean
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3712
 * @work_done: amount of napi work completed this call
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3713
 * @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
  3714
 *
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3715
 * 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
  3716
 * is no guarantee that everything was cleaned
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3717
 */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3718
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
  3719
				     struct e1000_rx_ring *rx_ring,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3720
				     int *work_done, int work_to_do)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3721
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3722
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3723
	struct net_device *netdev = adapter->netdev;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3724
	struct pci_dev *pdev = adapter->pdev;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3725
	struct e1000_rx_desc *rx_desc, *next_rxd;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3726
	struct e1000_buffer *buffer_info, *next_buffer;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3727
	unsigned long irq_flags;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3728
	u32 length;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3729
	unsigned int i;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3730
	int cleaned_count = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3731
	bool cleaned = false;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3732
	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
  3733
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3734
	i = rx_ring->next_to_clean;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3735
	rx_desc = E1000_RX_DESC(*rx_ring, i);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3736
	buffer_info = &rx_ring->buffer_info[i];
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3737
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3738
	while (rx_desc->status & E1000_RXD_STAT_DD) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3739
		struct sk_buff *skb;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3740
		u8 status;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3741
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3742
		if (*work_done >= work_to_do)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3743
			break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3744
		(*work_done)++;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3745
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3746
		status = rx_desc->status;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3747
		skb = buffer_info->skb;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3748
		if (!adapter->ecdev) buffer_info->skb = NULL;
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
		if (++i == rx_ring->count) i = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3751
		next_rxd = E1000_RX_DESC(*rx_ring, i);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3752
		prefetch(next_rxd);
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_buffer = &rx_ring->buffer_info[i];
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3755
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3756
		cleaned = true;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3757
		cleaned_count++;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3758
		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
  3759
		               PCI_DMA_FROMDEVICE);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3760
		buffer_info->dma = 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
		length = le16_to_cpu(rx_desc->length);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3763
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3764
		/* errors is only valid for DD + EOP descriptors */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3765
		if (!adapter->ecdev &&
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3766
		    unlikely((status & E1000_RXD_STAT_EOP) &&
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3767
		    (rx_desc->errors & E1000_RXD_ERR_FRAME_ERR_MASK))) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3768
			u8 last_byte = *(skb->data + length - 1);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3769
			if (TBI_ACCEPT(hw, status, rx_desc->errors, length,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3770
				       last_byte)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3771
				spin_lock_irqsave(&adapter->stats_lock,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3772
				                  irq_flags);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3773
				e1000_tbi_adjust_stats(hw, &adapter->stats,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3774
				                       length, skb->data);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3775
				spin_unlock_irqrestore(&adapter->stats_lock,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3776
				                       irq_flags);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3777
				length--;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3778
			} else {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3779
				/* recycle both page and skb */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3780
				buffer_info->skb = skb;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3781
				/* an error means any chain goes out the window
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3782
				 * too */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3783
				if (rx_ring->rx_skb_top)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3784
					dev_kfree_skb(rx_ring->rx_skb_top);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3785
				rx_ring->rx_skb_top = NULL;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3786
				goto next_desc;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3787
			}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3788
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3789
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3790
#define rxtop rx_ring->rx_skb_top
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3791
		if (!(status & E1000_RXD_STAT_EOP)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3792
			/* this descriptor is only the beginning (or middle) */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3793
			if (!rxtop) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3794
				/* this is the beginning of a chain */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3795
				rxtop = skb;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3796
				skb_fill_page_desc(rxtop, 0, buffer_info->page,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3797
				                   0, length);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3798
			} else {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3799
				/* this is the middle of a chain */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3800
				skb_fill_page_desc(rxtop,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3801
				    skb_shinfo(rxtop)->nr_frags,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3802
				    buffer_info->page, 0, length);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3803
				/* re-use the skb, only consumed the page */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3804
				buffer_info->skb = skb;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3805
			}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3806
			e1000_consume_page(buffer_info, rxtop, length);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3807
			goto next_desc;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3808
		} else {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3809
			if (rxtop) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3810
				/* end of the chain */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3811
				skb_fill_page_desc(rxtop,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3812
				    skb_shinfo(rxtop)->nr_frags,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3813
				    buffer_info->page, 0, length);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3814
				/* re-use the current skb, we only consumed the
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3815
				 * page */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3816
				buffer_info->skb = skb;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3817
				skb = rxtop;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3818
				rxtop = NULL;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3819
				e1000_consume_page(buffer_info, skb, length);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3820
			} else {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3821
				/* no chain, got EOP, this buf is the packet
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3822
				 * copybreak to save the put_page/alloc_page */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3823
				if (length <= copybreak &&
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3824
				    skb_tailroom(skb) >= length) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3825
					u8 *vaddr;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3826
					vaddr = kmap_atomic(buffer_info->page,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3827
					                    KM_SKB_DATA_SOFTIRQ);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3828
					memcpy(skb_tail_pointer(skb), vaddr, length);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3829
					kunmap_atomic(vaddr,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3830
					              KM_SKB_DATA_SOFTIRQ);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3831
					/* re-use the page, so don't erase
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3832
					 * buffer_info->page */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3833
					skb_put(skb, length);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3834
				} else {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3835
					skb_fill_page_desc(skb, 0,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3836
					                   buffer_info->page, 0,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3837
				                           length);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3838
					e1000_consume_page(buffer_info, skb,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3839
					                   length);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3840
				}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3841
			}
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
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3844
		/* Receive Checksum Offload XXX recompute due to CRC strip? */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3845
		e1000_rx_checksum(adapter,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3846
		                  (u32)(status) |
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3847
		                  ((u32)(rx_desc->errors) << 24),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3848
		                  le16_to_cpu(rx_desc->csum), skb);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3849
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3850
		pskb_trim(skb, skb->len - 4);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3851
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3852
		/* probably a little skewed due to removing CRC */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3853
		total_rx_bytes += skb->len;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3854
		total_rx_packets++;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3855
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3856
		/* 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
  3857
		if (!pskb_may_pull(skb, ETH_HLEN)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3858
			DPRINTK(DRV, ERR, "pskb_may_pull failed.\n");
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3859
			if (!adapter->ecdev) dev_kfree_skb(skb);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3860
			goto next_desc;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3861
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3862
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3863
		if (adapter->ecdev) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3864
			ecdev_receive(adapter->ecdev, skb->data, length);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3865
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3866
			// No need to detect link status as
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3867
			// long as frames are received: Reset watchdog.
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3868
			adapter->ec_watchdog_jiffies = jiffies;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3869
		} else {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3870
			skb->protocol = eth_type_trans(skb, netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3871
			e1000_receive_skb(adapter, status, rx_desc->special, skb);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3872
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3873
next_desc:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3874
		rx_desc->status = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3875
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3876
		/* 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
  3877
		if (unlikely(cleaned_count >= E1000_RX_BUFFER_WRITE)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3878
			adapter->alloc_rx_buf(adapter, rx_ring, cleaned_count);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3879
			cleaned_count = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3880
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3881
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3882
		/* use prefetched values */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3883
		rx_desc = next_rxd;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3884
		buffer_info = next_buffer;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3885
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3886
	rx_ring->next_to_clean = i;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3887
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3888
	cleaned_count = E1000_DESC_UNUSED(rx_ring);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3889
	if (cleaned_count)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3890
		adapter->alloc_rx_buf(adapter, rx_ring, cleaned_count);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3891
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3892
	adapter->total_rx_packets += total_rx_packets;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3893
	adapter->total_rx_bytes += total_rx_bytes;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3894
	netdev->stats.rx_bytes += total_rx_bytes;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3895
	netdev->stats.rx_packets += total_rx_packets;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3896
	return cleaned;
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
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3899
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3900
 * 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
  3901
 * @adapter: board private structure
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3902
 * @rx_ring: ring to clean
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3903
 * @work_done: amount of napi work completed this call
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3904
 * @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
  3905
 */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3906
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
  3907
			       struct e1000_rx_ring *rx_ring,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3908
			       int *work_done, int work_to_do)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3909
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3910
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3911
	struct net_device *netdev = adapter->netdev;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3912
	struct pci_dev *pdev = adapter->pdev;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3913
	struct e1000_rx_desc *rx_desc, *next_rxd;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3914
	struct e1000_buffer *buffer_info, *next_buffer;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3915
	unsigned long flags;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3916
	u32 length;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3917
	unsigned int i;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3918
	int cleaned_count = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3919
	bool cleaned = false;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3920
	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
  3921
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3922
	i = rx_ring->next_to_clean;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3923
	rx_desc = E1000_RX_DESC(*rx_ring, i);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3924
	buffer_info = &rx_ring->buffer_info[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
	while (rx_desc->status & E1000_RXD_STAT_DD) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3927
		struct sk_buff *skb;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3928
		u8 status;
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
		if (*work_done >= work_to_do)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3931
			break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3932
		(*work_done)++;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3933
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3934
		status = rx_desc->status;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3935
		skb = buffer_info->skb;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3936
		if (!adapter->ecdev) buffer_info->skb = NULL;
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
		prefetch(skb->data - NET_IP_ALIGN);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3939
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3940
		if (++i == rx_ring->count) i = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3941
		next_rxd = E1000_RX_DESC(*rx_ring, i);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3942
		prefetch(next_rxd);
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
		next_buffer = &rx_ring->buffer_info[i];
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3945
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3946
		cleaned = true;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3947
		cleaned_count++;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3948
		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
  3949
		                 PCI_DMA_FROMDEVICE);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3950
		buffer_info->dma = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3951
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3952
		length = le16_to_cpu(rx_desc->length);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3953
		/* !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
  3954
		 * 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
  3955
		 * 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
  3956
		 * 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
  3957
		 * definition only a frame fragment
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
		if (unlikely(!(status & E1000_RXD_STAT_EOP)))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3960
			adapter->discarding = true;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3961
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3962
		if (adapter->discarding) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3963
			/* All receives must fit into a single buffer */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3964
			E1000_DBG("%s: Receive packet consumed multiple"
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3965
				  " buffers\n", netdev->name);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3966
			/* recycle */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3967
			buffer_info->skb = skb;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3968
			if (status & E1000_RXD_STAT_EOP)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3969
				adapter->discarding = false;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3970
			goto next_desc;
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
		if (!adapter->ecdev &&
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3974
		    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
  3975
			u8 last_byte = *(skb->data + length - 1);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3976
			if (TBI_ACCEPT(hw, status, rx_desc->errors, length,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3977
				       last_byte)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3978
				spin_lock_irqsave(&adapter->stats_lock, flags);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3979
				e1000_tbi_adjust_stats(hw, &adapter->stats,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3980
				                       length, skb->data);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3981
				spin_unlock_irqrestore(&adapter->stats_lock,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3982
				                       flags);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3983
				length--;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3984
			} else {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3985
				/* recycle */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3986
				buffer_info->skb = skb;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3987
				goto next_desc;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3988
			}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3989
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3990
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3991
		/* adjust length to remove Ethernet CRC, this must be
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3992
		 * done after the TBI_ACCEPT workaround above */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3993
		length -= 4;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3994
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3995
		/* probably a little skewed due to removing CRC */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3996
		total_rx_bytes += length;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3997
		total_rx_packets++;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3998
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  3999
		/* code added for copybreak, this should improve
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4000
		 * performance for small packets with large amounts
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4001
		 * of reassembly being done in the stack */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4002
		if (!adapter->ecdev && length < copybreak) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4003
			struct sk_buff *new_skb =
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4004
			    netdev_alloc_skb_ip_align(netdev, length);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4005
			if (new_skb) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4006
				skb_copy_to_linear_data_offset(new_skb,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4007
							       -NET_IP_ALIGN,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4008
							       (skb->data -
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4009
							        NET_IP_ALIGN),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4010
							       (length +
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4011
							        NET_IP_ALIGN));
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4012
				/* save the skb in buffer_info as good */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4013
				buffer_info->skb = skb;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4014
				skb = new_skb;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4015
			}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4016
			/* else just continue with the old one */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4017
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4018
		/* end copybreak code */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4019
		skb_put(skb, length);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4020
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4021
		/* Receive Checksum Offload */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4022
		e1000_rx_checksum(adapter,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4023
				  (u32)(status) |
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4024
				  ((u32)(rx_desc->errors) << 24),
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4025
				  le16_to_cpu(rx_desc->csum), skb);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4026
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4027
		if (adapter->ecdev) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4028
			ecdev_receive(adapter->ecdev, skb->data, length);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4029
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4030
			// No need to detect link status as
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4031
			// long as frames are received: Reset watchdog.
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4032
			adapter->ec_watchdog_jiffies = jiffies;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4033
		} else {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4034
			skb->protocol = eth_type_trans(skb, netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4035
			e1000_receive_skb(adapter, status, rx_desc->special, skb);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4036
		}
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
next_desc:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4039
		rx_desc->status = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4040
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4041
		/* 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
  4042
		if (unlikely(cleaned_count >= E1000_RX_BUFFER_WRITE)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4043
			adapter->alloc_rx_buf(adapter, rx_ring, cleaned_count);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4044
			cleaned_count = 0;
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
		/* use prefetched values */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4048
		rx_desc = next_rxd;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4049
		buffer_info = next_buffer;
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
	rx_ring->next_to_clean = i;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4052
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4053
	cleaned_count = E1000_DESC_UNUSED(rx_ring);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4054
	if (cleaned_count)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4055
		adapter->alloc_rx_buf(adapter, rx_ring, cleaned_count);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4056
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4057
	adapter->total_rx_packets += total_rx_packets;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4058
	adapter->total_rx_bytes += total_rx_bytes;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4059
	netdev->stats.rx_bytes += total_rx_bytes;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4060
	netdev->stats.rx_packets += total_rx_packets;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4061
	return cleaned;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4062
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4063
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
 * 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
  4066
 * @adapter: address of board private structure
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4067
 * @rx_ring: pointer to receive ring structure
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4068
 * @cleaned_count: number of buffers to allocate this pass
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4069
 **/
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4070
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4071
static void
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4072
e1000_alloc_jumbo_rx_buffers(struct e1000_adapter *adapter,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4073
                             struct e1000_rx_ring *rx_ring, int cleaned_count)
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
	struct net_device *netdev = adapter->netdev;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4076
	struct pci_dev *pdev = adapter->pdev;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4077
	struct e1000_rx_desc *rx_desc;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4078
	struct e1000_buffer *buffer_info;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4079
	struct sk_buff *skb;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4080
	unsigned int i;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4081
	unsigned int bufsz = 256 - 16 /*for skb_reserve */ ;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4082
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4083
	i = rx_ring->next_to_use;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4084
	buffer_info = &rx_ring->buffer_info[i];
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4085
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4086
	while (cleaned_count--) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4087
		skb = buffer_info->skb;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4088
		if (skb) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4089
			skb_trim(skb, 0);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4090
			goto check_page;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4091
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4092
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4093
		skb = netdev_alloc_skb_ip_align(netdev, bufsz);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4094
		if (unlikely(!skb)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4095
			/* Better luck next round */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4096
			adapter->alloc_rx_buff_failed++;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4097
			break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4098
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4099
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4100
		/* Fix for errata 23, can't cross 64kB boundary */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4101
		if (!e1000_check_64k_bound(adapter, skb->data, bufsz)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4102
			struct sk_buff *oldskb = skb;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4103
			DPRINTK(PROBE, ERR, "skb align check failed: %u bytes "
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4104
					     "at %p\n", bufsz, skb->data);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4105
			/* Try again, without freeing the previous */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4106
			skb = netdev_alloc_skb_ip_align(netdev, bufsz);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4107
			/* Failed allocation, critical failure */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4108
			if (!skb) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4109
				dev_kfree_skb(oldskb);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4110
				adapter->alloc_rx_buff_failed++;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4111
				break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4112
			}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4113
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4114
			if (!e1000_check_64k_bound(adapter, skb->data, bufsz)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4115
				/* give up */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4116
				dev_kfree_skb(skb);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4117
				dev_kfree_skb(oldskb);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4118
				break; /* while (cleaned_count--) */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4119
			}
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
			/* Use new allocation */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4122
			dev_kfree_skb(oldskb);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4123
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4124
		buffer_info->skb = skb;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4125
		buffer_info->length = adapter->rx_buffer_len;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4126
check_page:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4127
		/* allocate a new page if necessary */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4128
		if (!buffer_info->page) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4129
			buffer_info->page = alloc_page(GFP_ATOMIC);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4130
			if (unlikely(!buffer_info->page)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4131
				adapter->alloc_rx_buff_failed++;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4132
				break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4133
			}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4134
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4135
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4136
		if (!buffer_info->dma) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4137
			buffer_info->dma = pci_map_page(pdev,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4138
			                                buffer_info->page, 0,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4139
			                                buffer_info->length,
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
			if (pci_dma_mapping_error(pdev, buffer_info->dma)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4142
				put_page(buffer_info->page);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4143
				dev_kfree_skb(skb);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4144
				buffer_info->page = NULL;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4145
				buffer_info->skb = NULL;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4146
				buffer_info->dma = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4147
				adapter->alloc_rx_buff_failed++;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4148
				break; /* while !buffer_info->skb */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4149
			}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4150
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4151
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4152
		rx_desc = E1000_RX_DESC(*rx_ring, i);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4153
		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
  4154
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4155
		if (unlikely(++i == rx_ring->count))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4156
			i = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4157
		buffer_info = &rx_ring->buffer_info[i];
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
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4160
	if (likely(rx_ring->next_to_use != i)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4161
		rx_ring->next_to_use = i;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4162
		if (unlikely(i-- == 0))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4163
			i = (rx_ring->count - 1);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4164
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4165
		/* Force memory writes to complete before letting h/w
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4166
		 * know there are new descriptors to fetch.  (Only
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4167
		 * applicable for weak-ordered memory model archs,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4168
		 * such as IA-64). */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4169
		wmb();
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4170
		writel(i, adapter->hw.hw_addr + rx_ring->rdt);
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
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
 * 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
  4176
 * @adapter: address of board private structure
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4177
 **/
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
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
  4180
				   struct e1000_rx_ring *rx_ring,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4181
				   int cleaned_count)
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
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4184
	struct net_device *netdev = adapter->netdev;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4185
	struct pci_dev *pdev = adapter->pdev;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4186
	struct e1000_rx_desc *rx_desc;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4187
	struct e1000_buffer *buffer_info;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4188
	struct sk_buff *skb;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4189
	unsigned int i;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4190
	unsigned int bufsz = adapter->rx_buffer_len;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4191
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4192
	i = rx_ring->next_to_use;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4193
	buffer_info = &rx_ring->buffer_info[i];
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4194
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4195
	while (cleaned_count--) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4196
		skb = buffer_info->skb;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4197
		if (skb) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4198
			skb_trim(skb, 0);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4199
			goto map_skb;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4200
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4201
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4202
		skb = netdev_alloc_skb_ip_align(netdev, bufsz);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4203
		if (unlikely(!skb)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4204
			/* Better luck next round */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4205
			adapter->alloc_rx_buff_failed++;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4206
			break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4207
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4208
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4209
		/* Fix for errata 23, can't cross 64kB boundary */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4210
		if (!e1000_check_64k_bound(adapter, skb->data, bufsz)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4211
			struct sk_buff *oldskb = skb;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4212
			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
  4213
					     "at %p\n", bufsz, skb->data);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4214
			/* Try again, without freeing the previous */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4215
			skb = netdev_alloc_skb_ip_align(netdev, bufsz);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4216
			/* Failed allocation, critical failure */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4217
			if (!skb) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4218
				dev_kfree_skb(oldskb);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4219
				adapter->alloc_rx_buff_failed++;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4220
				break;
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
			if (!e1000_check_64k_bound(adapter, skb->data, bufsz)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4224
				/* give up */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4225
				dev_kfree_skb(skb);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4226
				dev_kfree_skb(oldskb);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4227
				adapter->alloc_rx_buff_failed++;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4228
				break; /* while !buffer_info->skb */
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
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4231
			/* Use new allocation */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4232
			dev_kfree_skb(oldskb);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4233
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4234
		buffer_info->skb = skb;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4235
		buffer_info->length = adapter->rx_buffer_len;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4236
map_skb:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4237
		buffer_info->dma = pci_map_single(pdev,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4238
						  skb->data,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4239
						  buffer_info->length,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4240
						  PCI_DMA_FROMDEVICE);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4241
		if (pci_dma_mapping_error(pdev, buffer_info->dma)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4242
			dev_kfree_skb(skb);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4243
			buffer_info->skb = NULL;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4244
			buffer_info->dma = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4245
			adapter->alloc_rx_buff_failed++;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4246
			break; /* while !buffer_info->skb */
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
		/*
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4250
		 * 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
  4251
		 * boundary crossing
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4252
		 */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4253
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4254
		/* Fix for errata 23, can't cross 64kB boundary */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4255
		if (!e1000_check_64k_bound(adapter,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4256
					(void *)(unsigned long)buffer_info->dma,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4257
					adapter->rx_buffer_len)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4258
			DPRINTK(RX_ERR, ERR,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4259
				"dma align check failed: %u bytes at %p\n",
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4260
				adapter->rx_buffer_len,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4261
				(void *)(unsigned long)buffer_info->dma);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4262
			if (!adapter->ecdev) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4263
				dev_kfree_skb(skb);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4264
				buffer_info->skb = NULL;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4265
			}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4266
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4267
			pci_unmap_single(pdev, buffer_info->dma,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4268
					 adapter->rx_buffer_len,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4269
					 PCI_DMA_FROMDEVICE);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4270
			buffer_info->dma = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4271
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4272
			adapter->alloc_rx_buff_failed++;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4273
			break; /* while !buffer_info->skb */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4274
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4275
		rx_desc = E1000_RX_DESC(*rx_ring, i);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4276
		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
  4277
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4278
		if (unlikely(++i == rx_ring->count))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4279
			i = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4280
		buffer_info = &rx_ring->buffer_info[i];
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4281
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4282
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4283
	if (likely(rx_ring->next_to_use != i)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4284
		rx_ring->next_to_use = i;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4285
		if (unlikely(i-- == 0))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4286
			i = (rx_ring->count - 1);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4287
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4288
		/* Force memory writes to complete before letting h/w
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4289
		 * know there are new descriptors to fetch.  (Only
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4290
		 * applicable for weak-ordered memory model archs,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4291
		 * such as IA-64). */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4292
		wmb();
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4293
		writel(i, hw->hw_addr + rx_ring->rdt);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4294
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4295
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4296
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4297
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4298
 * 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
  4299
 * @adapter:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4300
 **/
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4301
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4302
static void e1000_smartspeed(struct e1000_adapter *adapter)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4303
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4304
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4305
	u16 phy_status;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4306
	u16 phy_ctrl;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4307
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4308
	if ((hw->phy_type != e1000_phy_igp) || !hw->autoneg ||
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4309
	   !(hw->autoneg_advertised & ADVERTISE_1000_FULL))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4310
		return;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4311
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4312
	if (adapter->smartspeed == 0) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4313
		/* If Master/Slave config fault is asserted twice,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4314
		 * we assume back-to-back */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4315
		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
  4316
		if (!(phy_status & SR_1000T_MS_CONFIG_FAULT)) return;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4317
		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
  4318
		if (!(phy_status & SR_1000T_MS_CONFIG_FAULT)) return;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4319
		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
  4320
		if (phy_ctrl & CR_1000T_MS_ENABLE) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4321
			phy_ctrl &= ~CR_1000T_MS_ENABLE;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4322
			e1000_write_phy_reg(hw, PHY_1000T_CTRL,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4323
					    phy_ctrl);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4324
			adapter->smartspeed++;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4325
			if (!e1000_phy_setup_autoneg(hw) &&
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4326
			   !e1000_read_phy_reg(hw, PHY_CTRL,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4327
				   	       &phy_ctrl)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4328
				phy_ctrl |= (MII_CR_AUTO_NEG_EN |
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4329
					     MII_CR_RESTART_AUTO_NEG);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4330
				e1000_write_phy_reg(hw, PHY_CTRL,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4331
						    phy_ctrl);
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
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4334
		return;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4335
	} else if (adapter->smartspeed == E1000_SMARTSPEED_DOWNSHIFT) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4336
		/* 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
  4337
		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
  4338
		phy_ctrl |= CR_1000T_MS_ENABLE;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4339
		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
  4340
		if (!e1000_phy_setup_autoneg(hw) &&
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4341
		   !e1000_read_phy_reg(hw, PHY_CTRL, &phy_ctrl)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4342
			phy_ctrl |= (MII_CR_AUTO_NEG_EN |
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4343
				     MII_CR_RESTART_AUTO_NEG);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4344
			e1000_write_phy_reg(hw, PHY_CTRL, phy_ctrl);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4345
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4346
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4347
	/* Restart process after E1000_SMARTSPEED_MAX iterations */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4348
	if (adapter->smartspeed++ == E1000_SMARTSPEED_MAX)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4349
		adapter->smartspeed = 0;
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
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
 * e1000_ioctl -
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4354
 * @netdev:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4355
 * @ifreq:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4356
 * @cmd:
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
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4359
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
  4360
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4361
	switch (cmd) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4362
	case SIOCGMIIPHY:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4363
	case SIOCGMIIREG:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4364
	case SIOCSMIIREG:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4365
		return e1000_mii_ioctl(netdev, ifr, cmd);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4366
	default:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4367
		return -EOPNOTSUPP;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4368
	}
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
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
 * e1000_mii_ioctl -
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4373
 * @netdev:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4374
 * @ifreq:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4375
 * @cmd:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4376
 **/
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4377
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4378
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
  4379
			   int cmd)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4380
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4381
	struct e1000_adapter *adapter = netdev_priv(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4382
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4383
	struct mii_ioctl_data *data = if_mii(ifr);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4384
	int retval;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4385
	u16 mii_reg;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4386
	u16 spddplx;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4387
	unsigned long flags;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4388
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4389
	if (hw->media_type != e1000_media_type_copper)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4390
		return -EOPNOTSUPP;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4391
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4392
	switch (cmd) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4393
	case SIOCGMIIPHY:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4394
		data->phy_id = hw->phy_addr;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4395
		break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4396
	case SIOCGMIIREG:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4397
		if (adapter->ecdev) return -EPERM;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4398
		spin_lock_irqsave(&adapter->stats_lock, flags);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4399
		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
  4400
				   &data->val_out)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4401
			spin_unlock_irqrestore(&adapter->stats_lock, flags);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4402
			return -EIO;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4403
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4404
		spin_unlock_irqrestore(&adapter->stats_lock, flags);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4405
		break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4406
	case SIOCSMIIREG:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4407
		if (adapter->ecdev) return -EPERM;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4408
		if (data->reg_num & ~(0x1F))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4409
			return -EFAULT;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4410
		mii_reg = data->val_in;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4411
		spin_lock_irqsave(&adapter->stats_lock, flags);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4412
		if (e1000_write_phy_reg(hw, data->reg_num,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4413
					mii_reg)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4414
			spin_unlock_irqrestore(&adapter->stats_lock, flags);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4415
			return -EIO;
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
		spin_unlock_irqrestore(&adapter->stats_lock, flags);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4418
		if (hw->media_type == e1000_media_type_copper) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4419
			switch (data->reg_num) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4420
			case PHY_CTRL:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4421
				if (mii_reg & MII_CR_POWER_DOWN)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4422
					break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4423
				if (mii_reg & MII_CR_AUTO_NEG_EN) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4424
					hw->autoneg = 1;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4425
					hw->autoneg_advertised = 0x2F;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4426
				} else {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4427
					if (mii_reg & 0x40)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4428
						spddplx = SPEED_1000;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4429
					else if (mii_reg & 0x2000)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4430
						spddplx = SPEED_100;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4431
					else
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4432
						spddplx = SPEED_10;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4433
					spddplx += (mii_reg & 0x100)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4434
						   ? DUPLEX_FULL :
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4435
						   DUPLEX_HALF;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4436
					retval = e1000_set_spd_dplx(adapter,
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4437
								    spddplx);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4438
					if (retval)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4439
						return retval;
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 (netif_running(adapter->netdev))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4442
					e1000_reinit_locked(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4443
				else
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4444
					e1000_reset(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4445
				break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4446
			case M88E1000_PHY_SPEC_CTRL:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4447
			case M88E1000_EXT_PHY_SPEC_CTRL:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4448
				if (e1000_phy_reset(hw))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4449
					return -EIO;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4450
				break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4451
			}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4452
		} else {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4453
			switch (data->reg_num) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4454
			case PHY_CTRL:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4455
				if (mii_reg & MII_CR_POWER_DOWN)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4456
					break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4457
				if (netif_running(adapter->netdev))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4458
					e1000_reinit_locked(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4459
				else
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4460
					e1000_reset(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4461
				break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4462
			}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4463
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4464
		break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4465
	default:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4466
		return -EOPNOTSUPP;
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
	return E1000_SUCCESS;
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
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4471
void e1000_pci_set_mwi(struct e1000_hw *hw)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4472
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4473
	struct e1000_adapter *adapter = hw->back;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4474
	int ret_val = pci_set_mwi(adapter->pdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4475
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4476
	if (ret_val)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4477
		DPRINTK(PROBE, ERR, "Error in setting MWI\n");
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4478
}
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
void e1000_pci_clear_mwi(struct e1000_hw *hw)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4481
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4482
	struct e1000_adapter *adapter = hw->back;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4483
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4484
	pci_clear_mwi(adapter->pdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4485
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4486
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4487
int e1000_pcix_get_mmrbc(struct e1000_hw *hw)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4488
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4489
	struct e1000_adapter *adapter = hw->back;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4490
	return pcix_get_mmrbc(adapter->pdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4491
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4492
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4493
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
  4494
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4495
	struct e1000_adapter *adapter = hw->back;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4496
	pcix_set_mmrbc(adapter->pdev, mmrbc);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4497
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4498
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4499
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
  4500
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4501
	outl(value, port);
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
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4504
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
  4505
				   struct vlan_group *grp)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4506
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4507
	struct e1000_adapter *adapter = netdev_priv(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4508
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4509
	u32 ctrl, rctl;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4510
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4511
	if (!test_bit(__E1000_DOWN, &adapter->flags))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4512
		e1000_irq_disable(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4513
	adapter->vlgrp = grp;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4514
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4515
	if (grp) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4516
		/* enable VLAN tag insert/strip */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4517
		ctrl = er32(CTRL);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4518
		ctrl |= E1000_CTRL_VME;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4519
		ew32(CTRL, ctrl);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4520
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4521
		/* enable VLAN receive filtering */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4522
		rctl = er32(RCTL);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4523
		rctl &= ~E1000_RCTL_CFIEN;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4524
		if (!(netdev->flags & IFF_PROMISC))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4525
			rctl |= E1000_RCTL_VFE;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4526
		ew32(RCTL, rctl);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4527
		e1000_update_mng_vlan(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4528
	} else {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4529
		/* disable VLAN tag insert/strip */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4530
		ctrl = er32(CTRL);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4531
		ctrl &= ~E1000_CTRL_VME;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4532
		ew32(CTRL, ctrl);
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
		/* disable VLAN receive filtering */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4535
		rctl = er32(RCTL);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4536
		rctl &= ~E1000_RCTL_VFE;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4537
		ew32(RCTL, rctl);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4538
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4539
		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
  4540
			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
  4541
			adapter->mng_vlan_id = E1000_MNG_VLAN_NONE;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4542
		}
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 (!test_bit(__E1000_DOWN, &adapter->flags))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4546
		e1000_irq_enable(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4547
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4548
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4549
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
  4550
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4551
	struct e1000_adapter *adapter = netdev_priv(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4552
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4553
	u32 vfta, index;
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
	if ((hw->mng_cookie.status &
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4556
	     E1000_MNG_DHCP_COOKIE_STATUS_VLAN_SUPPORT) &&
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4557
	    (vid == adapter->mng_vlan_id))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4558
		return;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4559
	/* add VID to filter table */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4560
	index = (vid >> 5) & 0x7F;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4561
	vfta = E1000_READ_REG_ARRAY(hw, VFTA, index);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4562
	vfta |= (1 << (vid & 0x1F));
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4563
	e1000_write_vfta(hw, index, vfta);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4564
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4565
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4566
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
  4567
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4568
	struct e1000_adapter *adapter = netdev_priv(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4569
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4570
	u32 vfta, index;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4571
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4572
	if (!test_bit(__E1000_DOWN, &adapter->flags))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4573
		e1000_irq_disable(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4574
	vlan_group_set_device(adapter->vlgrp, vid, NULL);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4575
	if (!test_bit(__E1000_DOWN, &adapter->flags))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4576
		e1000_irq_enable(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4577
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4578
	/* remove VID from filter table */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4579
	index = (vid >> 5) & 0x7F;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4580
	vfta = E1000_READ_REG_ARRAY(hw, VFTA, index);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4581
	vfta &= ~(1 << (vid & 0x1F));
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4582
	e1000_write_vfta(hw, index, vfta);
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
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4585
static void e1000_restore_vlan(struct e1000_adapter *adapter)
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
	e1000_vlan_rx_register(adapter->netdev, adapter->vlgrp);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4588
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4589
	if (adapter->vlgrp) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4590
		u16 vid;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4591
		for (vid = 0; vid < VLAN_GROUP_ARRAY_LEN; vid++) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4592
			if (!vlan_group_get_device(adapter->vlgrp, vid))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4593
				continue;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4594
			e1000_vlan_rx_add_vid(adapter->netdev, vid);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4595
		}
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
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4598
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4599
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
  4600
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4601
	struct e1000_hw *hw = &adapter->hw;
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
	hw->autoneg = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4604
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4605
	/* Fiber NICs only allow 1000 gbps Full duplex */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4606
	if ((hw->media_type == e1000_media_type_fiber) &&
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4607
		spddplx != (SPEED_1000 + DUPLEX_FULL)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4608
		DPRINTK(PROBE, ERR, "Unsupported Speed/Duplex configuration\n");
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4609
		return -EINVAL;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4610
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4611
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4612
	switch (spddplx) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4613
	case SPEED_10 + DUPLEX_HALF:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4614
		hw->forced_speed_duplex = e1000_10_half;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4615
		break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4616
	case SPEED_10 + DUPLEX_FULL:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4617
		hw->forced_speed_duplex = e1000_10_full;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4618
		break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4619
	case SPEED_100 + DUPLEX_HALF:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4620
		hw->forced_speed_duplex = e1000_100_half;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4621
		break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4622
	case SPEED_100 + DUPLEX_FULL:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4623
		hw->forced_speed_duplex = e1000_100_full;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4624
		break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4625
	case SPEED_1000 + DUPLEX_FULL:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4626
		hw->autoneg = 1;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4627
		hw->autoneg_advertised = ADVERTISE_1000_FULL;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4628
		break;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4629
	case SPEED_1000 + DUPLEX_HALF: /* not supported */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4630
	default:
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4631
		DPRINTK(PROBE, ERR, "Unsupported Speed/Duplex configuration\n");
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4632
		return -EINVAL;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4633
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4634
	return 0;
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
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4637
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
  4638
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4639
	struct net_device *netdev = pci_get_drvdata(pdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4640
	struct e1000_adapter *adapter = netdev_priv(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4641
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4642
	u32 ctrl, ctrl_ext, rctl, status;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4643
	u32 wufc = adapter->wol;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4644
#ifdef CONFIG_PM
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4645
	int retval = 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4646
#endif
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4647
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4648
	if (adapter->ecdev)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4649
		return -EBUSY;
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
	netif_device_detach(netdev);
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
	if (netif_running(netdev)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4654
		WARN_ON(test_bit(__E1000_RESETTING, &adapter->flags));
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4655
		e1000_down(adapter);
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
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4658
#ifdef CONFIG_PM
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4659
	retval = pci_save_state(pdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4660
	if (retval)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4661
		return retval;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4662
#endif
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4663
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4664
	status = er32(STATUS);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4665
	if (status & E1000_STATUS_LU)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4666
		wufc &= ~E1000_WUFC_LNKC;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4667
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4668
	if (wufc) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4669
		e1000_setup_rctl(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4670
		e1000_set_rx_mode(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4671
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4672
		/* 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
  4673
		if (wufc & E1000_WUFC_MC) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4674
			rctl = er32(RCTL);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4675
			rctl |= E1000_RCTL_MPE;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4676
			ew32(RCTL, rctl);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4677
		}
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
		if (hw->mac_type >= e1000_82540) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4680
			ctrl = er32(CTRL);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4681
			/* advertise wake from D3Cold */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4682
			#define E1000_CTRL_ADVD3WUC 0x00100000
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4683
			/* phy power management enable */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4684
			#define E1000_CTRL_EN_PHY_PWR_MGMT 0x00200000
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4685
			ctrl |= E1000_CTRL_ADVD3WUC |
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4686
				E1000_CTRL_EN_PHY_PWR_MGMT;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4687
			ew32(CTRL, ctrl);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4688
		}
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
		if (hw->media_type == e1000_media_type_fiber ||
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4691
		    hw->media_type == e1000_media_type_internal_serdes) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4692
			/* keep the laser running in D3 */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4693
			ctrl_ext = er32(CTRL_EXT);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4694
			ctrl_ext |= E1000_CTRL_EXT_SDP7_DATA;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4695
			ew32(CTRL_EXT, ctrl_ext);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4696
		}
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
		ew32(WUC, E1000_WUC_PME_EN);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4699
		ew32(WUFC, wufc);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4700
	} else {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4701
		ew32(WUC, 0);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4702
		ew32(WUFC, 0);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4703
	}
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
	e1000_release_manageability(adapter);
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
	*enable_wake = !!wufc;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4708
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4709
	/* 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
  4710
	if (adapter->en_mng_pt)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4711
		*enable_wake = true;
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
	if (netif_running(netdev))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4714
		e1000_free_irq(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4715
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4716
	pci_disable_device(pdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4717
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4718
	return 0;
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
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4721
#ifdef CONFIG_PM
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4722
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
  4723
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4724
	int retval;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4725
	bool wake;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4726
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4727
	retval = __e1000_shutdown(pdev, &wake);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4728
	if (retval)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4729
		return retval;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4730
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4731
	if (wake) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4732
		pci_prepare_to_sleep(pdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4733
	} else {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4734
		pci_wake_from_d3(pdev, false);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4735
		pci_set_power_state(pdev, PCI_D3hot);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4736
	}
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
	return 0;
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
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4741
static int e1000_resume(struct pci_dev *pdev)
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
	struct net_device *netdev = pci_get_drvdata(pdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4744
	struct e1000_adapter *adapter = netdev_priv(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4745
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4746
	u32 err;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4747
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4748
	if (adapter->ecdev)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4749
		return -EBUSY;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4750
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4751
	pci_set_power_state(pdev, PCI_D0);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4752
	pci_restore_state(pdev);
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 (adapter->need_ioport)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4755
		err = pci_enable_device(pdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4756
	else
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4757
		err = pci_enable_device_mem(pdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4758
	if (err) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4759
		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
  4760
		return err;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4761
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4762
	pci_set_master(pdev);
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
	pci_enable_wake(pdev, PCI_D3hot, 0);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4765
	pci_enable_wake(pdev, PCI_D3cold, 0);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4766
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4767
	if (netif_running(netdev)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4768
		err = e1000_request_irq(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4769
		if (err)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4770
			return err;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4771
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4772
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4773
	e1000_power_up_phy(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4774
	e1000_reset(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4775
	ew32(WUS, ~0);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4776
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4777
	e1000_init_manageability(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4778
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4779
	if (netif_running(netdev))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4780
		e1000_up(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4781
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4782
	if (!adapter->ecdev) netif_device_attach(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4783
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4784
	return 0;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4785
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4786
#endif
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4787
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4788
static void e1000_shutdown(struct pci_dev *pdev)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4789
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4790
	bool wake;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4791
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4792
	__e1000_shutdown(pdev, &wake);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4793
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4794
	if (system_state == SYSTEM_POWER_OFF) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4795
		pci_wake_from_d3(pdev, wake);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4796
		pci_set_power_state(pdev, PCI_D3hot);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4797
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4798
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4799
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4800
#ifdef CONFIG_NET_POLL_CONTROLLER
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4801
/*
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4802
 * 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
  4803
 * 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
  4804
 * the interrupt routine is executing.
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4805
 */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4806
static void e1000_netpoll(struct net_device *netdev)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4807
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4808
	struct e1000_adapter *adapter = netdev_priv(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4809
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4810
	disable_irq(adapter->pdev->irq);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4811
	e1000_intr(adapter->pdev->irq, netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4812
	enable_irq(adapter->pdev->irq);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4813
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4814
#endif
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4815
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4816
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4817
 * 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
  4818
 * @pdev: Pointer to PCI device
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4819
 * @state: The current pci connection state
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4820
 *
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4821
 * 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
  4822
 * this device has been detected.
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4823
 */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4824
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
  4825
						pci_channel_state_t state)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4826
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4827
	struct net_device *netdev = pci_get_drvdata(pdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4828
	struct e1000_adapter *adapter = netdev_priv(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4829
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4830
	netif_device_detach(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4831
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4832
	if (state == pci_channel_io_perm_failure)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4833
		return PCI_ERS_RESULT_DISCONNECT;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4834
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4835
	if (netif_running(netdev))
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4836
		e1000_down(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4837
	pci_disable_device(pdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4838
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4839
	/* Request a slot slot reset. */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4840
	return PCI_ERS_RESULT_NEED_RESET;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4841
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4842
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4843
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4844
 * 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
  4845
 * @pdev: Pointer to PCI device
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4846
 *
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4847
 * 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
  4848
 * resembles the first-half of the e1000_resume routine.
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4849
 */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4850
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
  4851
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4852
	struct net_device *netdev = pci_get_drvdata(pdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4853
	struct e1000_adapter *adapter = netdev_priv(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4854
	struct e1000_hw *hw = &adapter->hw;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4855
	int err;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4856
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4857
	if (adapter->need_ioport)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4858
		err = pci_enable_device(pdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4859
	else
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4860
		err = pci_enable_device_mem(pdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4861
	if (err) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4862
		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
  4863
		return PCI_ERS_RESULT_DISCONNECT;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4864
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4865
	pci_set_master(pdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4866
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4867
	pci_enable_wake(pdev, PCI_D3hot, 0);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4868
	pci_enable_wake(pdev, PCI_D3cold, 0);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4869
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4870
	e1000_reset(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4871
	ew32(WUS, ~0);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4872
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4873
	return PCI_ERS_RESULT_RECOVERED;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4874
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4875
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4876
/**
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4877
 * 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
  4878
 * @pdev: Pointer to PCI device
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4879
 *
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4880
 * 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
  4881
 * its OK to resume normal operation. Implementation resembles the
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4882
 * second-half of the e1000_resume routine.
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4883
 */
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4884
static void e1000_io_resume(struct pci_dev *pdev)
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4885
{
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4886
	struct net_device *netdev = pci_get_drvdata(pdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4887
	struct e1000_adapter *adapter = netdev_priv(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4888
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4889
	e1000_init_manageability(adapter);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4890
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4891
	if (netif_running(netdev)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4892
		if (e1000_up(adapter)) {
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4893
			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
  4894
			return;
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4895
		}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4896
	}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4897
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4898
	netif_device_attach(netdev);
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4899
}
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4900
b1266dd6bb2f Added e1000 driver for 2.6.33
Christoph Mathys <ch1010832@ch10pc602>
parents:
diff changeset
  4901
/* e1000_main.c */