devices/e1000/e1000_ethtool-2.6.22-orig.c
author Martin Troxler <martin.troxler@komaxgroup.com>
Tue, 15 Dec 2009 10:59:07 +0100
changeset 1601 a784812c787f
parent 788 9999ca1a1953
permissions -rw-r--r--
master FSM enables slave FSM
slave FSM should not be active when master is scanning or configuring the slaves
788
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     1
/*******************************************************************************
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     2
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     3
  Intel PRO/1000 Linux driver
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     4
  Copyright(c) 1999 - 2006 Intel Corporation.
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     5
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     6
  This program is free software; you can redistribute it and/or modify it
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     7
  under the terms and conditions of the GNU General Public License,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     8
  version 2, as published by the Free Software Foundation.
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     9
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    10
  This program is distributed in the hope it will be useful, but WITHOUT
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    11
  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    12
  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    13
  more details.
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    14
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    15
  You should have received a copy of the GNU General Public License along with
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    16
  this program; if not, write to the Free Software Foundation, Inc.,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    17
  51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    18
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    19
  The full GNU General Public License is included in this distribution in
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    20
  the file called "COPYING".
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    21
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    22
  Contact Information:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    23
  Linux NICS <linux.nics@intel.com>
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    24
  e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    25
  Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    26
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    27
*******************************************************************************/
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    28
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    29
/* ethtool support for e1000 */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    30
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    31
#include "e1000.h"
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    32
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    33
#include <asm/uaccess.h>
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    34
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    35
extern char e1000_driver_name[];
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    36
extern char e1000_driver_version[];
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    37
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    38
extern int e1000_up(struct e1000_adapter *adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    39
extern void e1000_down(struct e1000_adapter *adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    40
extern void e1000_reinit_locked(struct e1000_adapter *adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    41
extern void e1000_reset(struct e1000_adapter *adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    42
extern int e1000_set_spd_dplx(struct e1000_adapter *adapter, uint16_t spddplx);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    43
extern int e1000_setup_all_rx_resources(struct e1000_adapter *adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    44
extern int e1000_setup_all_tx_resources(struct e1000_adapter *adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    45
extern void e1000_free_all_rx_resources(struct e1000_adapter *adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    46
extern void e1000_free_all_tx_resources(struct e1000_adapter *adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    47
extern void e1000_update_stats(struct e1000_adapter *adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    48
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    49
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    50
struct e1000_stats {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    51
	char stat_string[ETH_GSTRING_LEN];
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    52
	int sizeof_stat;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    53
	int stat_offset;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    54
};
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    55
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    56
#define E1000_STAT(m) sizeof(((struct e1000_adapter *)0)->m), \
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    57
		      offsetof(struct e1000_adapter, m)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    58
static const struct e1000_stats e1000_gstrings_stats[] = {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    59
	{ "rx_packets", E1000_STAT(stats.gprc) },
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    60
	{ "tx_packets", E1000_STAT(stats.gptc) },
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    61
	{ "rx_bytes", E1000_STAT(stats.gorcl) },
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    62
	{ "tx_bytes", E1000_STAT(stats.gotcl) },
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    63
	{ "rx_broadcast", E1000_STAT(stats.bprc) },
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    64
	{ "tx_broadcast", E1000_STAT(stats.bptc) },
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    65
	{ "rx_multicast", E1000_STAT(stats.mprc) },
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    66
	{ "tx_multicast", E1000_STAT(stats.mptc) },
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    67
	{ "rx_errors", E1000_STAT(stats.rxerrc) },
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    68
	{ "tx_errors", E1000_STAT(stats.txerrc) },
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    69
	{ "tx_dropped", E1000_STAT(net_stats.tx_dropped) },
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    70
	{ "multicast", E1000_STAT(stats.mprc) },
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    71
	{ "collisions", E1000_STAT(stats.colc) },
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    72
	{ "rx_length_errors", E1000_STAT(stats.rlerrc) },
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    73
	{ "rx_over_errors", E1000_STAT(net_stats.rx_over_errors) },
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    74
	{ "rx_crc_errors", E1000_STAT(stats.crcerrs) },
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    75
	{ "rx_frame_errors", E1000_STAT(net_stats.rx_frame_errors) },
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    76
	{ "rx_no_buffer_count", E1000_STAT(stats.rnbc) },
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    77
	{ "rx_missed_errors", E1000_STAT(stats.mpc) },
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    78
	{ "tx_aborted_errors", E1000_STAT(stats.ecol) },
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    79
	{ "tx_carrier_errors", E1000_STAT(stats.tncrs) },
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    80
	{ "tx_fifo_errors", E1000_STAT(net_stats.tx_fifo_errors) },
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    81
	{ "tx_heartbeat_errors", E1000_STAT(net_stats.tx_heartbeat_errors) },
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    82
	{ "tx_window_errors", E1000_STAT(stats.latecol) },
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    83
	{ "tx_abort_late_coll", E1000_STAT(stats.latecol) },
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    84
	{ "tx_deferred_ok", E1000_STAT(stats.dc) },
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    85
	{ "tx_single_coll_ok", E1000_STAT(stats.scc) },
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    86
	{ "tx_multi_coll_ok", E1000_STAT(stats.mcc) },
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    87
	{ "tx_timeout_count", E1000_STAT(tx_timeout_count) },
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    88
	{ "tx_restart_queue", E1000_STAT(restart_queue) },
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    89
	{ "rx_long_length_errors", E1000_STAT(stats.roc) },
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    90
	{ "rx_short_length_errors", E1000_STAT(stats.ruc) },
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    91
	{ "rx_align_errors", E1000_STAT(stats.algnerrc) },
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    92
	{ "tx_tcp_seg_good", E1000_STAT(stats.tsctc) },
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    93
	{ "tx_tcp_seg_failed", E1000_STAT(stats.tsctfc) },
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    94
	{ "rx_flow_control_xon", E1000_STAT(stats.xonrxc) },
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    95
	{ "rx_flow_control_xoff", E1000_STAT(stats.xoffrxc) },
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    96
	{ "tx_flow_control_xon", E1000_STAT(stats.xontxc) },
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    97
	{ "tx_flow_control_xoff", E1000_STAT(stats.xofftxc) },
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    98
	{ "rx_long_byte_count", E1000_STAT(stats.gorcl) },
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    99
	{ "rx_csum_offload_good", E1000_STAT(hw_csum_good) },
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   100
	{ "rx_csum_offload_errors", E1000_STAT(hw_csum_err) },
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   101
	{ "rx_header_split", E1000_STAT(rx_hdr_split) },
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   102
	{ "alloc_rx_buff_failed", E1000_STAT(alloc_rx_buff_failed) },
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   103
	{ "tx_smbus", E1000_STAT(stats.mgptc) },
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   104
	{ "rx_smbus", E1000_STAT(stats.mgprc) },
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   105
	{ "dropped_smbus", E1000_STAT(stats.mgpdc) },
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   106
};
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   107
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   108
#define E1000_QUEUE_STATS_LEN 0
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   109
#define E1000_GLOBAL_STATS_LEN	\
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   110
	sizeof(e1000_gstrings_stats) / sizeof(struct e1000_stats)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   111
#define E1000_STATS_LEN (E1000_GLOBAL_STATS_LEN + E1000_QUEUE_STATS_LEN)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   112
static const char e1000_gstrings_test[][ETH_GSTRING_LEN] = {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   113
	"Register test  (offline)", "Eeprom test    (offline)",
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   114
	"Interrupt test (offline)", "Loopback test  (offline)",
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   115
	"Link test   (on/offline)"
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   116
};
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   117
#define E1000_TEST_LEN sizeof(e1000_gstrings_test) / ETH_GSTRING_LEN
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   118
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   119
static int
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   120
e1000_get_settings(struct net_device *netdev, struct ethtool_cmd *ecmd)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   121
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   122
	struct e1000_adapter *adapter = netdev_priv(netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   123
	struct e1000_hw *hw = &adapter->hw;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   124
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   125
	if (hw->media_type == e1000_media_type_copper) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   126
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   127
		ecmd->supported = (SUPPORTED_10baseT_Half |
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   128
		                   SUPPORTED_10baseT_Full |
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   129
		                   SUPPORTED_100baseT_Half |
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   130
		                   SUPPORTED_100baseT_Full |
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   131
		                   SUPPORTED_1000baseT_Full|
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   132
		                   SUPPORTED_Autoneg |
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   133
		                   SUPPORTED_TP);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   134
		if (hw->phy_type == e1000_phy_ife)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   135
			ecmd->supported &= ~SUPPORTED_1000baseT_Full;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   136
		ecmd->advertising = ADVERTISED_TP;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   137
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   138
		if (hw->autoneg == 1) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   139
			ecmd->advertising |= ADVERTISED_Autoneg;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   140
			/* the e1000 autoneg seems to match ethtool nicely */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   141
			ecmd->advertising |= hw->autoneg_advertised;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   142
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   143
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   144
		ecmd->port = PORT_TP;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   145
		ecmd->phy_address = hw->phy_addr;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   146
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   147
		if (hw->mac_type == e1000_82543)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   148
			ecmd->transceiver = XCVR_EXTERNAL;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   149
		else
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   150
			ecmd->transceiver = XCVR_INTERNAL;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   151
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   152
	} else {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   153
		ecmd->supported   = (SUPPORTED_1000baseT_Full |
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   154
				     SUPPORTED_FIBRE |
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   155
				     SUPPORTED_Autoneg);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   156
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   157
		ecmd->advertising = (ADVERTISED_1000baseT_Full |
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   158
				     ADVERTISED_FIBRE |
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   159
				     ADVERTISED_Autoneg);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   160
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   161
		ecmd->port = PORT_FIBRE;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   162
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   163
		if (hw->mac_type >= e1000_82545)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   164
			ecmd->transceiver = XCVR_INTERNAL;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   165
		else
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   166
			ecmd->transceiver = XCVR_EXTERNAL;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   167
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   168
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   169
	if (E1000_READ_REG(&adapter->hw, STATUS) & E1000_STATUS_LU) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   170
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   171
		e1000_get_speed_and_duplex(hw, &adapter->link_speed,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   172
		                                   &adapter->link_duplex);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   173
		ecmd->speed = adapter->link_speed;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   174
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   175
		/* unfortunatly FULL_DUPLEX != DUPLEX_FULL
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   176
		 *          and HALF_DUPLEX != DUPLEX_HALF */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   177
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   178
		if (adapter->link_duplex == FULL_DUPLEX)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   179
			ecmd->duplex = DUPLEX_FULL;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   180
		else
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   181
			ecmd->duplex = DUPLEX_HALF;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   182
	} else {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   183
		ecmd->speed = -1;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   184
		ecmd->duplex = -1;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   185
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   186
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   187
	ecmd->autoneg = ((hw->media_type == e1000_media_type_fiber) ||
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   188
			 hw->autoneg) ? AUTONEG_ENABLE : AUTONEG_DISABLE;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   189
	return 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   190
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   191
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   192
static int
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   193
e1000_set_settings(struct net_device *netdev, struct ethtool_cmd *ecmd)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   194
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   195
	struct e1000_adapter *adapter = netdev_priv(netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   196
	struct e1000_hw *hw = &adapter->hw;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   197
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   198
	/* When SoL/IDER sessions are active, autoneg/speed/duplex
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   199
	 * cannot be changed */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   200
	if (e1000_check_phy_reset_block(hw)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   201
		DPRINTK(DRV, ERR, "Cannot change link characteristics "
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   202
		        "when SoL/IDER is active.\n");
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   203
		return -EINVAL;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   204
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   205
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   206
	while (test_and_set_bit(__E1000_RESETTING, &adapter->flags))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   207
		msleep(1);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   208
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   209
	if (ecmd->autoneg == AUTONEG_ENABLE) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   210
		hw->autoneg = 1;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   211
		if (hw->media_type == e1000_media_type_fiber)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   212
			hw->autoneg_advertised = ADVERTISED_1000baseT_Full |
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   213
				     ADVERTISED_FIBRE |
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   214
				     ADVERTISED_Autoneg;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   215
		else
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   216
			hw->autoneg_advertised = ecmd->advertising |
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   217
			                         ADVERTISED_TP |
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   218
			                         ADVERTISED_Autoneg;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   219
		ecmd->advertising = hw->autoneg_advertised;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   220
	} else
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   221
		if (e1000_set_spd_dplx(adapter, ecmd->speed + ecmd->duplex)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   222
			clear_bit(__E1000_RESETTING, &adapter->flags);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   223
			return -EINVAL;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   224
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   225
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   226
	/* reset the link */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   227
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   228
	if (netif_running(adapter->netdev)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   229
		e1000_down(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   230
		e1000_up(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   231
	} else
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   232
		e1000_reset(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   233
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   234
	clear_bit(__E1000_RESETTING, &adapter->flags);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   235
	return 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   236
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   237
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   238
static void
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   239
e1000_get_pauseparam(struct net_device *netdev,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   240
                     struct ethtool_pauseparam *pause)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   241
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   242
	struct e1000_adapter *adapter = netdev_priv(netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   243
	struct e1000_hw *hw = &adapter->hw;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   244
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   245
	pause->autoneg =
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   246
		(adapter->fc_autoneg ? AUTONEG_ENABLE : AUTONEG_DISABLE);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   247
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   248
	if (hw->fc == E1000_FC_RX_PAUSE)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   249
		pause->rx_pause = 1;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   250
	else if (hw->fc == E1000_FC_TX_PAUSE)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   251
		pause->tx_pause = 1;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   252
	else if (hw->fc == E1000_FC_FULL) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   253
		pause->rx_pause = 1;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   254
		pause->tx_pause = 1;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   255
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   256
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   257
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   258
static int
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   259
e1000_set_pauseparam(struct net_device *netdev,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   260
                     struct ethtool_pauseparam *pause)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   261
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   262
	struct e1000_adapter *adapter = netdev_priv(netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   263
	struct e1000_hw *hw = &adapter->hw;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   264
	int retval = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   265
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   266
	adapter->fc_autoneg = pause->autoneg;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   267
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   268
	while (test_and_set_bit(__E1000_RESETTING, &adapter->flags))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   269
		msleep(1);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   270
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   271
	if (pause->rx_pause && pause->tx_pause)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   272
		hw->fc = E1000_FC_FULL;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   273
	else if (pause->rx_pause && !pause->tx_pause)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   274
		hw->fc = E1000_FC_RX_PAUSE;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   275
	else if (!pause->rx_pause && pause->tx_pause)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   276
		hw->fc = E1000_FC_TX_PAUSE;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   277
	else if (!pause->rx_pause && !pause->tx_pause)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   278
		hw->fc = E1000_FC_NONE;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   279
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   280
	hw->original_fc = hw->fc;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   281
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   282
	if (adapter->fc_autoneg == AUTONEG_ENABLE) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   283
		if (netif_running(adapter->netdev)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   284
			e1000_down(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   285
			e1000_up(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   286
		} else
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   287
			e1000_reset(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   288
	} else
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   289
		retval = ((hw->media_type == e1000_media_type_fiber) ?
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   290
			  e1000_setup_link(hw) : e1000_force_mac_fc(hw));
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   291
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   292
	clear_bit(__E1000_RESETTING, &adapter->flags);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   293
	return retval;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   294
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   295
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   296
static uint32_t
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   297
e1000_get_rx_csum(struct net_device *netdev)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   298
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   299
	struct e1000_adapter *adapter = netdev_priv(netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   300
	return adapter->rx_csum;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   301
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   302
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   303
static int
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   304
e1000_set_rx_csum(struct net_device *netdev, uint32_t data)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   305
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   306
	struct e1000_adapter *adapter = netdev_priv(netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   307
	adapter->rx_csum = data;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   308
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   309
	if (netif_running(netdev))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   310
		e1000_reinit_locked(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   311
	else
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   312
		e1000_reset(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   313
	return 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   314
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   315
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   316
static uint32_t
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   317
e1000_get_tx_csum(struct net_device *netdev)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   318
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   319
	return (netdev->features & NETIF_F_HW_CSUM) != 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   320
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   321
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   322
static int
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   323
e1000_set_tx_csum(struct net_device *netdev, uint32_t data)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   324
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   325
	struct e1000_adapter *adapter = netdev_priv(netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   326
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   327
	if (adapter->hw.mac_type < e1000_82543) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   328
		if (!data)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   329
			return -EINVAL;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   330
		return 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   331
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   332
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   333
	if (data)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   334
		netdev->features |= NETIF_F_HW_CSUM;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   335
	else
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   336
		netdev->features &= ~NETIF_F_HW_CSUM;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   337
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   338
	return 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   339
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   340
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   341
static int
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   342
e1000_set_tso(struct net_device *netdev, uint32_t data)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   343
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   344
	struct e1000_adapter *adapter = netdev_priv(netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   345
	if ((adapter->hw.mac_type < e1000_82544) ||
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   346
	    (adapter->hw.mac_type == e1000_82547))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   347
		return data ? -EINVAL : 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   348
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   349
	if (data)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   350
		netdev->features |= NETIF_F_TSO;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   351
	else
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   352
		netdev->features &= ~NETIF_F_TSO;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   353
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   354
	if (data)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   355
		netdev->features |= NETIF_F_TSO6;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   356
	else
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   357
		netdev->features &= ~NETIF_F_TSO6;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   358
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   359
	DPRINTK(PROBE, INFO, "TSO is %s\n", data ? "Enabled" : "Disabled");
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   360
	adapter->tso_force = TRUE;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   361
	return 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   362
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   363
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   364
static uint32_t
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   365
e1000_get_msglevel(struct net_device *netdev)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   366
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   367
	struct e1000_adapter *adapter = netdev_priv(netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   368
	return adapter->msg_enable;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   369
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   370
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   371
static void
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   372
e1000_set_msglevel(struct net_device *netdev, uint32_t data)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   373
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   374
	struct e1000_adapter *adapter = netdev_priv(netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   375
	adapter->msg_enable = data;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   376
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   377
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   378
static int
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   379
e1000_get_regs_len(struct net_device *netdev)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   380
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   381
#define E1000_REGS_LEN 32
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   382
	return E1000_REGS_LEN * sizeof(uint32_t);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   383
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   384
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   385
static void
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   386
e1000_get_regs(struct net_device *netdev,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   387
	       struct ethtool_regs *regs, void *p)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   388
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   389
	struct e1000_adapter *adapter = netdev_priv(netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   390
	struct e1000_hw *hw = &adapter->hw;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   391
	uint32_t *regs_buff = p;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   392
	uint16_t phy_data;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   393
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   394
	memset(p, 0, E1000_REGS_LEN * sizeof(uint32_t));
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   395
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   396
	regs->version = (1 << 24) | (hw->revision_id << 16) | hw->device_id;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   397
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   398
	regs_buff[0]  = E1000_READ_REG(hw, CTRL);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   399
	regs_buff[1]  = E1000_READ_REG(hw, STATUS);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   400
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   401
	regs_buff[2]  = E1000_READ_REG(hw, RCTL);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   402
	regs_buff[3]  = E1000_READ_REG(hw, RDLEN);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   403
	regs_buff[4]  = E1000_READ_REG(hw, RDH);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   404
	regs_buff[5]  = E1000_READ_REG(hw, RDT);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   405
	regs_buff[6]  = E1000_READ_REG(hw, RDTR);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   406
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   407
	regs_buff[7]  = E1000_READ_REG(hw, TCTL);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   408
	regs_buff[8]  = E1000_READ_REG(hw, TDLEN);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   409
	regs_buff[9]  = E1000_READ_REG(hw, TDH);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   410
	regs_buff[10] = E1000_READ_REG(hw, TDT);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   411
	regs_buff[11] = E1000_READ_REG(hw, TIDV);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   412
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   413
	regs_buff[12] = adapter->hw.phy_type;  /* PHY type (IGP=1, M88=0) */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   414
	if (hw->phy_type == e1000_phy_igp) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   415
		e1000_write_phy_reg(hw, IGP01E1000_PHY_PAGE_SELECT,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   416
				    IGP01E1000_PHY_AGC_A);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   417
		e1000_read_phy_reg(hw, IGP01E1000_PHY_AGC_A &
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   418
				   IGP01E1000_PHY_PAGE_SELECT, &phy_data);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   419
		regs_buff[13] = (uint32_t)phy_data; /* cable length */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   420
		e1000_write_phy_reg(hw, IGP01E1000_PHY_PAGE_SELECT,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   421
				    IGP01E1000_PHY_AGC_B);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   422
		e1000_read_phy_reg(hw, IGP01E1000_PHY_AGC_B &
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   423
				   IGP01E1000_PHY_PAGE_SELECT, &phy_data);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   424
		regs_buff[14] = (uint32_t)phy_data; /* cable length */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   425
		e1000_write_phy_reg(hw, IGP01E1000_PHY_PAGE_SELECT,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   426
				    IGP01E1000_PHY_AGC_C);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   427
		e1000_read_phy_reg(hw, IGP01E1000_PHY_AGC_C &
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   428
				   IGP01E1000_PHY_PAGE_SELECT, &phy_data);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   429
		regs_buff[15] = (uint32_t)phy_data; /* cable length */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   430
		e1000_write_phy_reg(hw, IGP01E1000_PHY_PAGE_SELECT,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   431
				    IGP01E1000_PHY_AGC_D);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   432
		e1000_read_phy_reg(hw, IGP01E1000_PHY_AGC_D &
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   433
				   IGP01E1000_PHY_PAGE_SELECT, &phy_data);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   434
		regs_buff[16] = (uint32_t)phy_data; /* cable length */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   435
		regs_buff[17] = 0; /* extended 10bt distance (not needed) */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   436
		e1000_write_phy_reg(hw, IGP01E1000_PHY_PAGE_SELECT, 0x0);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   437
		e1000_read_phy_reg(hw, IGP01E1000_PHY_PORT_STATUS &
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   438
				   IGP01E1000_PHY_PAGE_SELECT, &phy_data);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   439
		regs_buff[18] = (uint32_t)phy_data; /* cable polarity */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   440
		e1000_write_phy_reg(hw, IGP01E1000_PHY_PAGE_SELECT,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   441
				    IGP01E1000_PHY_PCS_INIT_REG);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   442
		e1000_read_phy_reg(hw, IGP01E1000_PHY_PCS_INIT_REG &
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   443
				   IGP01E1000_PHY_PAGE_SELECT, &phy_data);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   444
		regs_buff[19] = (uint32_t)phy_data; /* cable polarity */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   445
		regs_buff[20] = 0; /* polarity correction enabled (always) */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   446
		regs_buff[22] = 0; /* phy receive errors (unavailable) */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   447
		regs_buff[23] = regs_buff[18]; /* mdix mode */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   448
		e1000_write_phy_reg(hw, IGP01E1000_PHY_PAGE_SELECT, 0x0);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   449
	} else {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   450
		e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_STATUS, &phy_data);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   451
		regs_buff[13] = (uint32_t)phy_data; /* cable length */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   452
		regs_buff[14] = 0;  /* Dummy (to align w/ IGP phy reg dump) */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   453
		regs_buff[15] = 0;  /* Dummy (to align w/ IGP phy reg dump) */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   454
		regs_buff[16] = 0;  /* Dummy (to align w/ IGP phy reg dump) */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   455
		e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_CTRL, &phy_data);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   456
		regs_buff[17] = (uint32_t)phy_data; /* extended 10bt distance */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   457
		regs_buff[18] = regs_buff[13]; /* cable polarity */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   458
		regs_buff[19] = 0;  /* Dummy (to align w/ IGP phy reg dump) */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   459
		regs_buff[20] = regs_buff[17]; /* polarity correction */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   460
		/* phy receive errors */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   461
		regs_buff[22] = adapter->phy_stats.receive_errors;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   462
		regs_buff[23] = regs_buff[13]; /* mdix mode */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   463
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   464
	regs_buff[21] = adapter->phy_stats.idle_errors;  /* phy idle errors */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   465
	e1000_read_phy_reg(hw, PHY_1000T_STATUS, &phy_data);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   466
	regs_buff[24] = (uint32_t)phy_data;  /* phy local receiver status */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   467
	regs_buff[25] = regs_buff[24];  /* phy remote receiver status */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   468
	if (hw->mac_type >= e1000_82540 &&
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   469
	    hw->mac_type < e1000_82571 &&
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   470
	    hw->media_type == e1000_media_type_copper) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   471
		regs_buff[26] = E1000_READ_REG(hw, MANC);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   472
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   473
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   474
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   475
static int
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   476
e1000_get_eeprom_len(struct net_device *netdev)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   477
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   478
	struct e1000_adapter *adapter = netdev_priv(netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   479
	return adapter->hw.eeprom.word_size * 2;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   480
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   481
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   482
static int
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   483
e1000_get_eeprom(struct net_device *netdev,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   484
                      struct ethtool_eeprom *eeprom, uint8_t *bytes)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   485
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   486
	struct e1000_adapter *adapter = netdev_priv(netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   487
	struct e1000_hw *hw = &adapter->hw;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   488
	uint16_t *eeprom_buff;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   489
	int first_word, last_word;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   490
	int ret_val = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   491
	uint16_t i;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   492
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   493
	if (eeprom->len == 0)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   494
		return -EINVAL;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   495
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   496
	eeprom->magic = hw->vendor_id | (hw->device_id << 16);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   497
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   498
	first_word = eeprom->offset >> 1;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   499
	last_word = (eeprom->offset + eeprom->len - 1) >> 1;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   500
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   501
	eeprom_buff = kmalloc(sizeof(uint16_t) *
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   502
			(last_word - first_word + 1), GFP_KERNEL);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   503
	if (!eeprom_buff)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   504
		return -ENOMEM;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   505
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   506
	if (hw->eeprom.type == e1000_eeprom_spi)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   507
		ret_val = e1000_read_eeprom(hw, first_word,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   508
					    last_word - first_word + 1,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   509
					    eeprom_buff);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   510
	else {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   511
		for (i = 0; i < last_word - first_word + 1; i++)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   512
			if ((ret_val = e1000_read_eeprom(hw, first_word + i, 1,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   513
							&eeprom_buff[i])))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   514
				break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   515
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   516
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   517
	/* Device's eeprom is always little-endian, word addressable */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   518
	for (i = 0; i < last_word - first_word + 1; i++)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   519
		le16_to_cpus(&eeprom_buff[i]);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   520
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   521
	memcpy(bytes, (uint8_t *)eeprom_buff + (eeprom->offset & 1),
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   522
			eeprom->len);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   523
	kfree(eeprom_buff);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   524
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   525
	return ret_val;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   526
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   527
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   528
static int
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   529
e1000_set_eeprom(struct net_device *netdev,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   530
                      struct ethtool_eeprom *eeprom, uint8_t *bytes)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   531
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   532
	struct e1000_adapter *adapter = netdev_priv(netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   533
	struct e1000_hw *hw = &adapter->hw;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   534
	uint16_t *eeprom_buff;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   535
	void *ptr;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   536
	int max_len, first_word, last_word, ret_val = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   537
	uint16_t i;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   538
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   539
	if (eeprom->len == 0)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   540
		return -EOPNOTSUPP;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   541
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   542
	if (eeprom->magic != (hw->vendor_id | (hw->device_id << 16)))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   543
		return -EFAULT;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   544
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   545
	max_len = hw->eeprom.word_size * 2;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   546
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   547
	first_word = eeprom->offset >> 1;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   548
	last_word = (eeprom->offset + eeprom->len - 1) >> 1;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   549
	eeprom_buff = kmalloc(max_len, GFP_KERNEL);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   550
	if (!eeprom_buff)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   551
		return -ENOMEM;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   552
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   553
	ptr = (void *)eeprom_buff;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   554
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   555
	if (eeprom->offset & 1) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   556
		/* need read/modify/write of first changed EEPROM word */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   557
		/* only the second byte of the word is being modified */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   558
		ret_val = e1000_read_eeprom(hw, first_word, 1,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   559
					    &eeprom_buff[0]);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   560
		ptr++;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   561
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   562
	if (((eeprom->offset + eeprom->len) & 1) && (ret_val == 0)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   563
		/* need read/modify/write of last changed EEPROM word */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   564
		/* only the first byte of the word is being modified */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   565
		ret_val = e1000_read_eeprom(hw, last_word, 1,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   566
		                  &eeprom_buff[last_word - first_word]);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   567
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   568
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   569
	/* Device's eeprom is always little-endian, word addressable */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   570
	for (i = 0; i < last_word - first_word + 1; i++)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   571
		le16_to_cpus(&eeprom_buff[i]);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   572
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   573
	memcpy(ptr, bytes, eeprom->len);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   574
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   575
	for (i = 0; i < last_word - first_word + 1; i++)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   576
		eeprom_buff[i] = cpu_to_le16(eeprom_buff[i]);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   577
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   578
	ret_val = e1000_write_eeprom(hw, first_word,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   579
				     last_word - first_word + 1, eeprom_buff);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   580
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   581
	/* Update the checksum over the first part of the EEPROM if needed
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   582
	 * and flush shadow RAM for 82573 conrollers */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   583
	if ((ret_val == 0) && ((first_word <= EEPROM_CHECKSUM_REG) ||
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   584
				(hw->mac_type == e1000_82573)))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   585
		e1000_update_eeprom_checksum(hw);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   586
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   587
	kfree(eeprom_buff);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   588
	return ret_val;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   589
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   590
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   591
static void
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   592
e1000_get_drvinfo(struct net_device *netdev,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   593
                       struct ethtool_drvinfo *drvinfo)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   594
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   595
	struct e1000_adapter *adapter = netdev_priv(netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   596
	char firmware_version[32];
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   597
	uint16_t eeprom_data;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   598
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   599
	strncpy(drvinfo->driver,  e1000_driver_name, 32);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   600
	strncpy(drvinfo->version, e1000_driver_version, 32);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   601
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   602
	/* EEPROM image version # is reported as firmware version # for
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   603
	 * 8257{1|2|3} controllers */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   604
	e1000_read_eeprom(&adapter->hw, 5, 1, &eeprom_data);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   605
	switch (adapter->hw.mac_type) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   606
	case e1000_82571:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   607
	case e1000_82572:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   608
	case e1000_82573:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   609
	case e1000_80003es2lan:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   610
	case e1000_ich8lan:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   611
		sprintf(firmware_version, "%d.%d-%d",
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   612
			(eeprom_data & 0xF000) >> 12,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   613
			(eeprom_data & 0x0FF0) >> 4,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   614
			eeprom_data & 0x000F);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   615
		break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   616
	default:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   617
		sprintf(firmware_version, "N/A");
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   618
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   619
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   620
	strncpy(drvinfo->fw_version, firmware_version, 32);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   621
	strncpy(drvinfo->bus_info, pci_name(adapter->pdev), 32);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   622
	drvinfo->n_stats = E1000_STATS_LEN;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   623
	drvinfo->testinfo_len = E1000_TEST_LEN;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   624
	drvinfo->regdump_len = e1000_get_regs_len(netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   625
	drvinfo->eedump_len = e1000_get_eeprom_len(netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   626
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   627
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   628
static void
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   629
e1000_get_ringparam(struct net_device *netdev,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   630
                    struct ethtool_ringparam *ring)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   631
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   632
	struct e1000_adapter *adapter = netdev_priv(netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   633
	e1000_mac_type mac_type = adapter->hw.mac_type;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   634
	struct e1000_tx_ring *txdr = adapter->tx_ring;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   635
	struct e1000_rx_ring *rxdr = adapter->rx_ring;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   636
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   637
	ring->rx_max_pending = (mac_type < e1000_82544) ? E1000_MAX_RXD :
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   638
		E1000_MAX_82544_RXD;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   639
	ring->tx_max_pending = (mac_type < e1000_82544) ? E1000_MAX_TXD :
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   640
		E1000_MAX_82544_TXD;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   641
	ring->rx_mini_max_pending = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   642
	ring->rx_jumbo_max_pending = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   643
	ring->rx_pending = rxdr->count;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   644
	ring->tx_pending = txdr->count;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   645
	ring->rx_mini_pending = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   646
	ring->rx_jumbo_pending = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   647
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   648
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   649
static int
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   650
e1000_set_ringparam(struct net_device *netdev,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   651
                    struct ethtool_ringparam *ring)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   652
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   653
	struct e1000_adapter *adapter = netdev_priv(netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   654
	e1000_mac_type mac_type = adapter->hw.mac_type;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   655
	struct e1000_tx_ring *txdr, *tx_old;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   656
	struct e1000_rx_ring *rxdr, *rx_old;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   657
	int i, err;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   658
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   659
	if ((ring->rx_mini_pending) || (ring->rx_jumbo_pending))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   660
		return -EINVAL;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   661
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   662
	while (test_and_set_bit(__E1000_RESETTING, &adapter->flags))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   663
		msleep(1);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   664
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   665
	if (netif_running(adapter->netdev))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   666
		e1000_down(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   667
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   668
	tx_old = adapter->tx_ring;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   669
	rx_old = adapter->rx_ring;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   670
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   671
	err = -ENOMEM;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   672
	txdr = kcalloc(adapter->num_tx_queues, sizeof(struct e1000_tx_ring), GFP_KERNEL);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   673
	if (!txdr)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   674
		goto err_alloc_tx;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   675
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   676
	rxdr = kcalloc(adapter->num_rx_queues, sizeof(struct e1000_rx_ring), GFP_KERNEL);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   677
	if (!rxdr)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   678
		goto err_alloc_rx;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   679
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   680
	adapter->tx_ring = txdr;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   681
	adapter->rx_ring = rxdr;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   682
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   683
	rxdr->count = max(ring->rx_pending,(uint32_t)E1000_MIN_RXD);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   684
	rxdr->count = min(rxdr->count,(uint32_t)(mac_type < e1000_82544 ?
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   685
		E1000_MAX_RXD : E1000_MAX_82544_RXD));
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   686
	rxdr->count = ALIGN(rxdr->count, REQ_RX_DESCRIPTOR_MULTIPLE);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   687
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   688
	txdr->count = max(ring->tx_pending,(uint32_t)E1000_MIN_TXD);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   689
	txdr->count = min(txdr->count,(uint32_t)(mac_type < e1000_82544 ?
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   690
		E1000_MAX_TXD : E1000_MAX_82544_TXD));
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   691
	txdr->count = ALIGN(txdr->count, REQ_TX_DESCRIPTOR_MULTIPLE);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   692
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   693
	for (i = 0; i < adapter->num_tx_queues; i++)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   694
		txdr[i].count = txdr->count;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   695
	for (i = 0; i < adapter->num_rx_queues; i++)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   696
		rxdr[i].count = rxdr->count;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   697
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   698
	if (netif_running(adapter->netdev)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   699
		/* Try to get new resources before deleting old */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   700
		if ((err = e1000_setup_all_rx_resources(adapter)))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   701
			goto err_setup_rx;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   702
		if ((err = e1000_setup_all_tx_resources(adapter)))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   703
			goto err_setup_tx;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   704
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   705
		/* save the new, restore the old in order to free it,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   706
		 * then restore the new back again */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   707
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   708
		adapter->rx_ring = rx_old;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   709
		adapter->tx_ring = tx_old;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   710
		e1000_free_all_rx_resources(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   711
		e1000_free_all_tx_resources(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   712
		kfree(tx_old);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   713
		kfree(rx_old);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   714
		adapter->rx_ring = rxdr;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   715
		adapter->tx_ring = txdr;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   716
		if ((err = e1000_up(adapter)))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   717
			goto err_setup;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   718
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   719
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   720
	clear_bit(__E1000_RESETTING, &adapter->flags);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   721
	return 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   722
err_setup_tx:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   723
	e1000_free_all_rx_resources(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   724
err_setup_rx:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   725
	adapter->rx_ring = rx_old;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   726
	adapter->tx_ring = tx_old;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   727
	kfree(rxdr);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   728
err_alloc_rx:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   729
	kfree(txdr);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   730
err_alloc_tx:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   731
	e1000_up(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   732
err_setup:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   733
	clear_bit(__E1000_RESETTING, &adapter->flags);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   734
	return err;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   735
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   736
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   737
#define REG_PATTERN_TEST(R, M, W)                                              \
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   738
{                                                                              \
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   739
	uint32_t pat, value;                                                   \
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   740
	uint32_t test[] =                                                      \
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   741
		{0x5A5A5A5A, 0xA5A5A5A5, 0x00000000, 0xFFFFFFFF};              \
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   742
	for (pat = 0; pat < ARRAY_SIZE(test); pat++) {              \
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   743
		E1000_WRITE_REG(&adapter->hw, R, (test[pat] & W));             \
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   744
		value = E1000_READ_REG(&adapter->hw, R);                       \
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   745
		if (value != (test[pat] & W & M)) {                             \
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   746
			DPRINTK(DRV, ERR, "pattern test reg %04X failed: got " \
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   747
			        "0x%08X expected 0x%08X\n",                    \
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   748
			        E1000_##R, value, (test[pat] & W & M));        \
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   749
			*data = (adapter->hw.mac_type < e1000_82543) ?         \
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   750
				E1000_82542_##R : E1000_##R;                   \
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   751
			return 1;                                              \
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   752
		}                                                              \
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   753
	}                                                                      \
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   754
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   755
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   756
#define REG_SET_AND_CHECK(R, M, W)                                             \
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   757
{                                                                              \
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   758
	uint32_t value;                                                        \
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   759
	E1000_WRITE_REG(&adapter->hw, R, W & M);                               \
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   760
	value = E1000_READ_REG(&adapter->hw, R);                               \
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   761
	if ((W & M) != (value & M)) {                                          \
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   762
		DPRINTK(DRV, ERR, "set/check reg %04X test failed: got 0x%08X "\
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   763
		        "expected 0x%08X\n", E1000_##R, (value & M), (W & M)); \
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   764
		*data = (adapter->hw.mac_type < e1000_82543) ?                 \
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   765
			E1000_82542_##R : E1000_##R;                           \
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   766
		return 1;                                                      \
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   767
	}                                                                      \
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   768
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   769
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   770
static int
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   771
e1000_reg_test(struct e1000_adapter *adapter, uint64_t *data)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   772
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   773
	uint32_t value, before, after;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   774
	uint32_t i, toggle;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   775
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   776
	/* The status register is Read Only, so a write should fail.
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   777
	 * Some bits that get toggled are ignored.
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   778
	 */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   779
	switch (adapter->hw.mac_type) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   780
	/* there are several bits on newer hardware that are r/w */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   781
	case e1000_82571:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   782
	case e1000_82572:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   783
	case e1000_80003es2lan:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   784
		toggle = 0x7FFFF3FF;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   785
		break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   786
	case e1000_82573:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   787
	case e1000_ich8lan:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   788
		toggle = 0x7FFFF033;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   789
		break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   790
	default:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   791
		toggle = 0xFFFFF833;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   792
		break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   793
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   794
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   795
	before = E1000_READ_REG(&adapter->hw, STATUS);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   796
	value = (E1000_READ_REG(&adapter->hw, STATUS) & toggle);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   797
	E1000_WRITE_REG(&adapter->hw, STATUS, toggle);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   798
	after = E1000_READ_REG(&adapter->hw, STATUS) & toggle;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   799
	if (value != after) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   800
		DPRINTK(DRV, ERR, "failed STATUS register test got: "
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   801
		        "0x%08X expected: 0x%08X\n", after, value);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   802
		*data = 1;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   803
		return 1;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   804
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   805
	/* restore previous status */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   806
	E1000_WRITE_REG(&adapter->hw, STATUS, before);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   807
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   808
	if (adapter->hw.mac_type != e1000_ich8lan) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   809
		REG_PATTERN_TEST(FCAL, 0xFFFFFFFF, 0xFFFFFFFF);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   810
		REG_PATTERN_TEST(FCAH, 0x0000FFFF, 0xFFFFFFFF);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   811
		REG_PATTERN_TEST(FCT, 0x0000FFFF, 0xFFFFFFFF);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   812
		REG_PATTERN_TEST(VET, 0x0000FFFF, 0xFFFFFFFF);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   813
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   814
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   815
	REG_PATTERN_TEST(RDTR, 0x0000FFFF, 0xFFFFFFFF);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   816
	REG_PATTERN_TEST(RDBAH, 0xFFFFFFFF, 0xFFFFFFFF);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   817
	REG_PATTERN_TEST(RDLEN, 0x000FFF80, 0x000FFFFF);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   818
	REG_PATTERN_TEST(RDH, 0x0000FFFF, 0x0000FFFF);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   819
	REG_PATTERN_TEST(RDT, 0x0000FFFF, 0x0000FFFF);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   820
	REG_PATTERN_TEST(FCRTH, 0x0000FFF8, 0x0000FFF8);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   821
	REG_PATTERN_TEST(FCTTV, 0x0000FFFF, 0x0000FFFF);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   822
	REG_PATTERN_TEST(TIPG, 0x3FFFFFFF, 0x3FFFFFFF);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   823
	REG_PATTERN_TEST(TDBAH, 0xFFFFFFFF, 0xFFFFFFFF);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   824
	REG_PATTERN_TEST(TDLEN, 0x000FFF80, 0x000FFFFF);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   825
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   826
	REG_SET_AND_CHECK(RCTL, 0xFFFFFFFF, 0x00000000);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   827
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   828
	before = (adapter->hw.mac_type == e1000_ich8lan ?
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   829
	          0x06C3B33E : 0x06DFB3FE);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   830
	REG_SET_AND_CHECK(RCTL, before, 0x003FFFFB);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   831
	REG_SET_AND_CHECK(TCTL, 0xFFFFFFFF, 0x00000000);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   832
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   833
	if (adapter->hw.mac_type >= e1000_82543) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   834
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   835
		REG_SET_AND_CHECK(RCTL, before, 0xFFFFFFFF);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   836
		REG_PATTERN_TEST(RDBAL, 0xFFFFFFF0, 0xFFFFFFFF);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   837
		if (adapter->hw.mac_type != e1000_ich8lan)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   838
			REG_PATTERN_TEST(TXCW, 0xC000FFFF, 0x0000FFFF);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   839
		REG_PATTERN_TEST(TDBAL, 0xFFFFFFF0, 0xFFFFFFFF);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   840
		REG_PATTERN_TEST(TIDV, 0x0000FFFF, 0x0000FFFF);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   841
		value = (adapter->hw.mac_type == e1000_ich8lan ?
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   842
		         E1000_RAR_ENTRIES_ICH8LAN : E1000_RAR_ENTRIES);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   843
		for (i = 0; i < value; i++) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   844
			REG_PATTERN_TEST(RA + (((i << 1) + 1) << 2), 0x8003FFFF,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   845
			                 0xFFFFFFFF);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   846
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   847
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   848
	} else {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   849
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   850
		REG_SET_AND_CHECK(RCTL, 0xFFFFFFFF, 0x01FFFFFF);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   851
		REG_PATTERN_TEST(RDBAL, 0xFFFFF000, 0xFFFFFFFF);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   852
		REG_PATTERN_TEST(TXCW, 0x0000FFFF, 0x0000FFFF);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   853
		REG_PATTERN_TEST(TDBAL, 0xFFFFF000, 0xFFFFFFFF);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   854
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   855
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   856
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   857
	value = (adapter->hw.mac_type == e1000_ich8lan ?
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   858
			E1000_MC_TBL_SIZE_ICH8LAN : E1000_MC_TBL_SIZE);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   859
	for (i = 0; i < value; i++)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   860
		REG_PATTERN_TEST(MTA + (i << 2), 0xFFFFFFFF, 0xFFFFFFFF);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   861
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   862
	*data = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   863
	return 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   864
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   865
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   866
static int
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   867
e1000_eeprom_test(struct e1000_adapter *adapter, uint64_t *data)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   868
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   869
	uint16_t temp;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   870
	uint16_t checksum = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   871
	uint16_t i;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   872
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   873
	*data = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   874
	/* Read and add up the contents of the EEPROM */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   875
	for (i = 0; i < (EEPROM_CHECKSUM_REG + 1); i++) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   876
		if ((e1000_read_eeprom(&adapter->hw, i, 1, &temp)) < 0) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   877
			*data = 1;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   878
			break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   879
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   880
		checksum += temp;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   881
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   882
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   883
	/* If Checksum is not Correct return error else test passed */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   884
	if ((checksum != (uint16_t) EEPROM_SUM) && !(*data))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   885
		*data = 2;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   886
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   887
	return *data;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   888
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   889
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   890
static irqreturn_t
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   891
e1000_test_intr(int irq, void *data)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   892
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   893
	struct net_device *netdev = (struct net_device *) data;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   894
	struct e1000_adapter *adapter = netdev_priv(netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   895
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   896
	adapter->test_icr |= E1000_READ_REG(&adapter->hw, ICR);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   897
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   898
	return IRQ_HANDLED;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   899
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   900
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   901
static int
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   902
e1000_intr_test(struct e1000_adapter *adapter, uint64_t *data)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   903
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   904
	struct net_device *netdev = adapter->netdev;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   905
	uint32_t mask, i=0, shared_int = TRUE;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   906
	uint32_t irq = adapter->pdev->irq;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   907
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   908
	*data = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   909
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   910
	/* NOTE: we don't test MSI interrupts here, yet */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   911
	/* Hook up test interrupt handler just for this test */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   912
	if (!request_irq(irq, &e1000_test_intr, IRQF_PROBE_SHARED, netdev->name,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   913
	                 netdev))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   914
		shared_int = FALSE;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   915
	else if (request_irq(irq, &e1000_test_intr, IRQF_SHARED,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   916
	         netdev->name, netdev)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   917
		*data = 1;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   918
		return -1;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   919
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   920
	DPRINTK(HW, INFO, "testing %s interrupt\n",
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   921
	        (shared_int ? "shared" : "unshared"));
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   922
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   923
	/* Disable all the interrupts */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   924
	E1000_WRITE_REG(&adapter->hw, IMC, 0xFFFFFFFF);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   925
	msleep(10);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   926
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   927
	/* Test each interrupt */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   928
	for (; i < 10; i++) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   929
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   930
		if (adapter->hw.mac_type == e1000_ich8lan && i == 8)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   931
			continue;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   932
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   933
		/* Interrupt to test */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   934
		mask = 1 << i;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   935
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   936
		if (!shared_int) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   937
			/* Disable the interrupt to be reported in
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   938
			 * the cause register and then force the same
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   939
			 * interrupt and see if one gets posted.  If
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   940
			 * an interrupt was posted to the bus, the
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   941
			 * test failed.
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   942
			 */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   943
			adapter->test_icr = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   944
			E1000_WRITE_REG(&adapter->hw, IMC, mask);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   945
			E1000_WRITE_REG(&adapter->hw, ICS, mask);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   946
			msleep(10);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   947
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   948
			if (adapter->test_icr & mask) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   949
				*data = 3;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   950
				break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   951
			}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   952
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   953
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   954
		/* Enable the interrupt to be reported in
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   955
		 * the cause register and then force the same
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   956
		 * interrupt and see if one gets posted.  If
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   957
		 * an interrupt was not posted to the bus, the
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   958
		 * test failed.
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   959
		 */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   960
		adapter->test_icr = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   961
		E1000_WRITE_REG(&adapter->hw, IMS, mask);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   962
		E1000_WRITE_REG(&adapter->hw, ICS, mask);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   963
		msleep(10);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   964
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   965
		if (!(adapter->test_icr & mask)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   966
			*data = 4;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   967
			break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   968
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   969
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   970
		if (!shared_int) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   971
			/* Disable the other interrupts to be reported in
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   972
			 * the cause register and then force the other
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   973
			 * interrupts and see if any get posted.  If
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   974
			 * an interrupt was posted to the bus, the
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   975
			 * test failed.
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   976
			 */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   977
			adapter->test_icr = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   978
			E1000_WRITE_REG(&adapter->hw, IMC, ~mask & 0x00007FFF);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   979
			E1000_WRITE_REG(&adapter->hw, ICS, ~mask & 0x00007FFF);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   980
			msleep(10);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   981
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   982
			if (adapter->test_icr) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   983
				*data = 5;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   984
				break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   985
			}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   986
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   987
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   988
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   989
	/* Disable all the interrupts */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   990
	E1000_WRITE_REG(&adapter->hw, IMC, 0xFFFFFFFF);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   991
	msleep(10);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   992
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   993
	/* Unhook test interrupt handler */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   994
	free_irq(irq, netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   995
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   996
	return *data;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   997
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   998
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   999
static void
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1000
e1000_free_desc_rings(struct e1000_adapter *adapter)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1001
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1002
	struct e1000_tx_ring *txdr = &adapter->test_tx_ring;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1003
	struct e1000_rx_ring *rxdr = &adapter->test_rx_ring;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1004
	struct pci_dev *pdev = adapter->pdev;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1005
	int i;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1006
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1007
	if (txdr->desc && txdr->buffer_info) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1008
		for (i = 0; i < txdr->count; i++) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1009
			if (txdr->buffer_info[i].dma)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1010
				pci_unmap_single(pdev, txdr->buffer_info[i].dma,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1011
						 txdr->buffer_info[i].length,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1012
						 PCI_DMA_TODEVICE);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1013
			if (txdr->buffer_info[i].skb)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1014
				dev_kfree_skb(txdr->buffer_info[i].skb);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1015
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1016
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1017
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1018
	if (rxdr->desc && rxdr->buffer_info) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1019
		for (i = 0; i < rxdr->count; i++) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1020
			if (rxdr->buffer_info[i].dma)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1021
				pci_unmap_single(pdev, rxdr->buffer_info[i].dma,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1022
						 rxdr->buffer_info[i].length,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1023
						 PCI_DMA_FROMDEVICE);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1024
			if (rxdr->buffer_info[i].skb)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1025
				dev_kfree_skb(rxdr->buffer_info[i].skb);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1026
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1027
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1028
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1029
	if (txdr->desc) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1030
		pci_free_consistent(pdev, txdr->size, txdr->desc, txdr->dma);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1031
		txdr->desc = NULL;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1032
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1033
	if (rxdr->desc) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1034
		pci_free_consistent(pdev, rxdr->size, rxdr->desc, rxdr->dma);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1035
		rxdr->desc = NULL;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1036
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1037
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1038
	kfree(txdr->buffer_info);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1039
	txdr->buffer_info = NULL;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1040
	kfree(rxdr->buffer_info);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1041
	rxdr->buffer_info = NULL;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1042
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1043
	return;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1044
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1045
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1046
static int
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1047
e1000_setup_desc_rings(struct e1000_adapter *adapter)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1048
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1049
	struct e1000_tx_ring *txdr = &adapter->test_tx_ring;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1050
	struct e1000_rx_ring *rxdr = &adapter->test_rx_ring;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1051
	struct pci_dev *pdev = adapter->pdev;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1052
	uint32_t rctl;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1053
	int i, ret_val;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1054
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1055
	/* Setup Tx descriptor ring and Tx buffers */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1056
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1057
	if (!txdr->count)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1058
		txdr->count = E1000_DEFAULT_TXD;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1059
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1060
	if (!(txdr->buffer_info = kcalloc(txdr->count,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1061
	                                  sizeof(struct e1000_buffer),
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1062
		                          GFP_KERNEL))) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1063
		ret_val = 1;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1064
		goto err_nomem;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1065
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1066
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1067
	txdr->size = txdr->count * sizeof(struct e1000_tx_desc);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1068
	txdr->size = ALIGN(txdr->size, 4096);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1069
	if (!(txdr->desc = pci_alloc_consistent(pdev, txdr->size,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1070
	                                        &txdr->dma))) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1071
		ret_val = 2;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1072
		goto err_nomem;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1073
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1074
	memset(txdr->desc, 0, txdr->size);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1075
	txdr->next_to_use = txdr->next_to_clean = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1076
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1077
	E1000_WRITE_REG(&adapter->hw, TDBAL,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1078
			((uint64_t) txdr->dma & 0x00000000FFFFFFFF));
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1079
	E1000_WRITE_REG(&adapter->hw, TDBAH, ((uint64_t) txdr->dma >> 32));
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1080
	E1000_WRITE_REG(&adapter->hw, TDLEN,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1081
			txdr->count * sizeof(struct e1000_tx_desc));
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1082
	E1000_WRITE_REG(&adapter->hw, TDH, 0);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1083
	E1000_WRITE_REG(&adapter->hw, TDT, 0);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1084
	E1000_WRITE_REG(&adapter->hw, TCTL,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1085
			E1000_TCTL_PSP | E1000_TCTL_EN |
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1086
			E1000_COLLISION_THRESHOLD << E1000_CT_SHIFT |
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1087
			E1000_FDX_COLLISION_DISTANCE << E1000_COLD_SHIFT);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1088
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1089
	for (i = 0; i < txdr->count; i++) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1090
		struct e1000_tx_desc *tx_desc = E1000_TX_DESC(*txdr, i);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1091
		struct sk_buff *skb;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1092
		unsigned int size = 1024;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1093
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1094
		if (!(skb = alloc_skb(size, GFP_KERNEL))) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1095
			ret_val = 3;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1096
			goto err_nomem;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1097
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1098
		skb_put(skb, size);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1099
		txdr->buffer_info[i].skb = skb;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1100
		txdr->buffer_info[i].length = skb->len;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1101
		txdr->buffer_info[i].dma =
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1102
			pci_map_single(pdev, skb->data, skb->len,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1103
				       PCI_DMA_TODEVICE);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1104
		tx_desc->buffer_addr = cpu_to_le64(txdr->buffer_info[i].dma);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1105
		tx_desc->lower.data = cpu_to_le32(skb->len);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1106
		tx_desc->lower.data |= cpu_to_le32(E1000_TXD_CMD_EOP |
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1107
						   E1000_TXD_CMD_IFCS |
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1108
						   E1000_TXD_CMD_RPS);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1109
		tx_desc->upper.data = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1110
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1111
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1112
	/* Setup Rx descriptor ring and Rx buffers */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1113
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1114
	if (!rxdr->count)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1115
		rxdr->count = E1000_DEFAULT_RXD;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1116
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1117
	if (!(rxdr->buffer_info = kcalloc(rxdr->count,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1118
	                                  sizeof(struct e1000_buffer),
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1119
	                                  GFP_KERNEL))) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1120
		ret_val = 4;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1121
		goto err_nomem;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1122
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1123
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1124
	rxdr->size = rxdr->count * sizeof(struct e1000_rx_desc);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1125
	if (!(rxdr->desc = pci_alloc_consistent(pdev, rxdr->size, &rxdr->dma))) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1126
		ret_val = 5;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1127
		goto err_nomem;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1128
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1129
	memset(rxdr->desc, 0, rxdr->size);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1130
	rxdr->next_to_use = rxdr->next_to_clean = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1131
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1132
	rctl = E1000_READ_REG(&adapter->hw, RCTL);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1133
	E1000_WRITE_REG(&adapter->hw, RCTL, rctl & ~E1000_RCTL_EN);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1134
	E1000_WRITE_REG(&adapter->hw, RDBAL,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1135
			((uint64_t) rxdr->dma & 0xFFFFFFFF));
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1136
	E1000_WRITE_REG(&adapter->hw, RDBAH, ((uint64_t) rxdr->dma >> 32));
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1137
	E1000_WRITE_REG(&adapter->hw, RDLEN, rxdr->size);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1138
	E1000_WRITE_REG(&adapter->hw, RDH, 0);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1139
	E1000_WRITE_REG(&adapter->hw, RDT, 0);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1140
	rctl = E1000_RCTL_EN | E1000_RCTL_BAM | E1000_RCTL_SZ_2048 |
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1141
		E1000_RCTL_LBM_NO | E1000_RCTL_RDMTS_HALF |
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1142
		(adapter->hw.mc_filter_type << E1000_RCTL_MO_SHIFT);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1143
	E1000_WRITE_REG(&adapter->hw, RCTL, rctl);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1144
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1145
	for (i = 0; i < rxdr->count; i++) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1146
		struct e1000_rx_desc *rx_desc = E1000_RX_DESC(*rxdr, i);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1147
		struct sk_buff *skb;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1148
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1149
		if (!(skb = alloc_skb(E1000_RXBUFFER_2048 + NET_IP_ALIGN,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1150
				GFP_KERNEL))) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1151
			ret_val = 6;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1152
			goto err_nomem;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1153
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1154
		skb_reserve(skb, NET_IP_ALIGN);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1155
		rxdr->buffer_info[i].skb = skb;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1156
		rxdr->buffer_info[i].length = E1000_RXBUFFER_2048;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1157
		rxdr->buffer_info[i].dma =
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1158
			pci_map_single(pdev, skb->data, E1000_RXBUFFER_2048,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1159
				       PCI_DMA_FROMDEVICE);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1160
		rx_desc->buffer_addr = cpu_to_le64(rxdr->buffer_info[i].dma);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1161
		memset(skb->data, 0x00, skb->len);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1162
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1163
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1164
	return 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1165
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1166
err_nomem:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1167
	e1000_free_desc_rings(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1168
	return ret_val;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1169
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1170
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1171
static void
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1172
e1000_phy_disable_receiver(struct e1000_adapter *adapter)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1173
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1174
	/* Write out to PHY registers 29 and 30 to disable the Receiver. */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1175
	e1000_write_phy_reg(&adapter->hw, 29, 0x001F);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1176
	e1000_write_phy_reg(&adapter->hw, 30, 0x8FFC);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1177
	e1000_write_phy_reg(&adapter->hw, 29, 0x001A);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1178
	e1000_write_phy_reg(&adapter->hw, 30, 0x8FF0);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1179
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1180
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1181
static void
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1182
e1000_phy_reset_clk_and_crs(struct e1000_adapter *adapter)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1183
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1184
	uint16_t phy_reg;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1185
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1186
	/* Because we reset the PHY above, we need to re-force TX_CLK in the
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1187
	 * Extended PHY Specific Control Register to 25MHz clock.  This
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1188
	 * value defaults back to a 2.5MHz clock when the PHY is reset.
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1189
	 */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1190
	e1000_read_phy_reg(&adapter->hw, M88E1000_EXT_PHY_SPEC_CTRL, &phy_reg);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1191
	phy_reg |= M88E1000_EPSCR_TX_CLK_25;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1192
	e1000_write_phy_reg(&adapter->hw,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1193
		M88E1000_EXT_PHY_SPEC_CTRL, phy_reg);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1194
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1195
	/* In addition, because of the s/w reset above, we need to enable
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1196
	 * CRS on TX.  This must be set for both full and half duplex
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1197
	 * operation.
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1198
	 */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1199
	e1000_read_phy_reg(&adapter->hw, M88E1000_PHY_SPEC_CTRL, &phy_reg);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1200
	phy_reg |= M88E1000_PSCR_ASSERT_CRS_ON_TX;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1201
	e1000_write_phy_reg(&adapter->hw,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1202
		M88E1000_PHY_SPEC_CTRL, phy_reg);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1203
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1204
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1205
static int
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1206
e1000_nonintegrated_phy_loopback(struct e1000_adapter *adapter)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1207
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1208
	uint32_t ctrl_reg;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1209
	uint16_t phy_reg;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1210
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1211
	/* Setup the Device Control Register for PHY loopback test. */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1212
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1213
	ctrl_reg = E1000_READ_REG(&adapter->hw, CTRL);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1214
	ctrl_reg |= (E1000_CTRL_ILOS |		/* Invert Loss-Of-Signal */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1215
		     E1000_CTRL_FRCSPD |	/* Set the Force Speed Bit */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1216
		     E1000_CTRL_FRCDPX |	/* Set the Force Duplex Bit */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1217
		     E1000_CTRL_SPD_1000 |	/* Force Speed to 1000 */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1218
		     E1000_CTRL_FD);		/* Force Duplex to FULL */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1219
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1220
	E1000_WRITE_REG(&adapter->hw, CTRL, ctrl_reg);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1221
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1222
	/* Read the PHY Specific Control Register (0x10) */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1223
	e1000_read_phy_reg(&adapter->hw, M88E1000_PHY_SPEC_CTRL, &phy_reg);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1224
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1225
	/* Clear Auto-Crossover bits in PHY Specific Control Register
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1226
	 * (bits 6:5).
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1227
	 */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1228
	phy_reg &= ~M88E1000_PSCR_AUTO_X_MODE;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1229
	e1000_write_phy_reg(&adapter->hw, M88E1000_PHY_SPEC_CTRL, phy_reg);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1230
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1231
	/* Perform software reset on the PHY */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1232
	e1000_phy_reset(&adapter->hw);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1233
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1234
	/* Have to setup TX_CLK and TX_CRS after software reset */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1235
	e1000_phy_reset_clk_and_crs(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1236
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1237
	e1000_write_phy_reg(&adapter->hw, PHY_CTRL, 0x8100);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1238
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1239
	/* Wait for reset to complete. */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1240
	udelay(500);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1241
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1242
	/* Have to setup TX_CLK and TX_CRS after software reset */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1243
	e1000_phy_reset_clk_and_crs(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1244
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1245
	/* Write out to PHY registers 29 and 30 to disable the Receiver. */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1246
	e1000_phy_disable_receiver(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1247
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1248
	/* Set the loopback bit in the PHY control register. */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1249
	e1000_read_phy_reg(&adapter->hw, PHY_CTRL, &phy_reg);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1250
	phy_reg |= MII_CR_LOOPBACK;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1251
	e1000_write_phy_reg(&adapter->hw, PHY_CTRL, phy_reg);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1252
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1253
	/* Setup TX_CLK and TX_CRS one more time. */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1254
	e1000_phy_reset_clk_and_crs(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1255
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1256
	/* Check Phy Configuration */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1257
	e1000_read_phy_reg(&adapter->hw, PHY_CTRL, &phy_reg);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1258
	if (phy_reg != 0x4100)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1259
		 return 9;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1260
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1261
	e1000_read_phy_reg(&adapter->hw, M88E1000_EXT_PHY_SPEC_CTRL, &phy_reg);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1262
	if (phy_reg != 0x0070)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1263
		return 10;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1264
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1265
	e1000_read_phy_reg(&adapter->hw, 29, &phy_reg);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1266
	if (phy_reg != 0x001A)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1267
		return 11;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1268
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1269
	return 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1270
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1271
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1272
static int
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1273
e1000_integrated_phy_loopback(struct e1000_adapter *adapter)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1274
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1275
	uint32_t ctrl_reg = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1276
	uint32_t stat_reg = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1277
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1278
	adapter->hw.autoneg = FALSE;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1279
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1280
	if (adapter->hw.phy_type == e1000_phy_m88) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1281
		/* Auto-MDI/MDIX Off */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1282
		e1000_write_phy_reg(&adapter->hw,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1283
				    M88E1000_PHY_SPEC_CTRL, 0x0808);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1284
		/* reset to update Auto-MDI/MDIX */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1285
		e1000_write_phy_reg(&adapter->hw, PHY_CTRL, 0x9140);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1286
		/* autoneg off */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1287
		e1000_write_phy_reg(&adapter->hw, PHY_CTRL, 0x8140);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1288
	} else if (adapter->hw.phy_type == e1000_phy_gg82563)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1289
		e1000_write_phy_reg(&adapter->hw,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1290
		                    GG82563_PHY_KMRN_MODE_CTRL,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1291
		                    0x1CC);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1292
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1293
	ctrl_reg = E1000_READ_REG(&adapter->hw, CTRL);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1294
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1295
	if (adapter->hw.phy_type == e1000_phy_ife) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1296
		/* force 100, set loopback */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1297
		e1000_write_phy_reg(&adapter->hw, PHY_CTRL, 0x6100);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1298
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1299
		/* Now set up the MAC to the same speed/duplex as the PHY. */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1300
		ctrl_reg &= ~E1000_CTRL_SPD_SEL; /* Clear the speed sel bits */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1301
		ctrl_reg |= (E1000_CTRL_FRCSPD | /* Set the Force Speed Bit */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1302
			     E1000_CTRL_FRCDPX | /* Set the Force Duplex Bit */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1303
			     E1000_CTRL_SPD_100 |/* Force Speed to 100 */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1304
			     E1000_CTRL_FD);	 /* Force Duplex to FULL */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1305
	} else {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1306
		/* force 1000, set loopback */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1307
		e1000_write_phy_reg(&adapter->hw, PHY_CTRL, 0x4140);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1308
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1309
		/* Now set up the MAC to the same speed/duplex as the PHY. */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1310
		ctrl_reg = E1000_READ_REG(&adapter->hw, CTRL);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1311
		ctrl_reg &= ~E1000_CTRL_SPD_SEL; /* Clear the speed sel bits */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1312
		ctrl_reg |= (E1000_CTRL_FRCSPD | /* Set the Force Speed Bit */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1313
			     E1000_CTRL_FRCDPX | /* Set the Force Duplex Bit */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1314
			     E1000_CTRL_SPD_1000 |/* Force Speed to 1000 */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1315
			     E1000_CTRL_FD);	 /* Force Duplex to FULL */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1316
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1317
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1318
	if (adapter->hw.media_type == e1000_media_type_copper &&
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1319
	   adapter->hw.phy_type == e1000_phy_m88)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1320
		ctrl_reg |= E1000_CTRL_ILOS; /* Invert Loss of Signal */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1321
	else {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1322
		/* Set the ILOS bit on the fiber Nic is half
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1323
		 * duplex link is detected. */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1324
		stat_reg = E1000_READ_REG(&adapter->hw, STATUS);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1325
		if ((stat_reg & E1000_STATUS_FD) == 0)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1326
			ctrl_reg |= (E1000_CTRL_ILOS | E1000_CTRL_SLU);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1327
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1328
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1329
	E1000_WRITE_REG(&adapter->hw, CTRL, ctrl_reg);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1330
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1331
	/* Disable the receiver on the PHY so when a cable is plugged in, the
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1332
	 * PHY does not begin to autoneg when a cable is reconnected to the NIC.
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1333
	 */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1334
	if (adapter->hw.phy_type == e1000_phy_m88)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1335
		e1000_phy_disable_receiver(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1336
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1337
	udelay(500);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1338
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1339
	return 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1340
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1341
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1342
static int
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1343
e1000_set_phy_loopback(struct e1000_adapter *adapter)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1344
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1345
	uint16_t phy_reg = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1346
	uint16_t count = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1347
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1348
	switch (adapter->hw.mac_type) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1349
	case e1000_82543:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1350
		if (adapter->hw.media_type == e1000_media_type_copper) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1351
			/* Attempt to setup Loopback mode on Non-integrated PHY.
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1352
			 * Some PHY registers get corrupted at random, so
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1353
			 * attempt this 10 times.
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1354
			 */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1355
			while (e1000_nonintegrated_phy_loopback(adapter) &&
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1356
			      count++ < 10);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1357
			if (count < 11)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1358
				return 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1359
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1360
		break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1361
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1362
	case e1000_82544:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1363
	case e1000_82540:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1364
	case e1000_82545:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1365
	case e1000_82545_rev_3:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1366
	case e1000_82546:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1367
	case e1000_82546_rev_3:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1368
	case e1000_82541:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1369
	case e1000_82541_rev_2:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1370
	case e1000_82547:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1371
	case e1000_82547_rev_2:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1372
	case e1000_82571:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1373
	case e1000_82572:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1374
	case e1000_82573:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1375
	case e1000_80003es2lan:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1376
	case e1000_ich8lan:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1377
		return e1000_integrated_phy_loopback(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1378
		break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1379
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1380
	default:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1381
		/* Default PHY loopback work is to read the MII
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1382
		 * control register and assert bit 14 (loopback mode).
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1383
		 */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1384
		e1000_read_phy_reg(&adapter->hw, PHY_CTRL, &phy_reg);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1385
		phy_reg |= MII_CR_LOOPBACK;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1386
		e1000_write_phy_reg(&adapter->hw, PHY_CTRL, phy_reg);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1387
		return 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1388
		break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1389
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1390
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1391
	return 8;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1392
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1393
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1394
static int
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1395
e1000_setup_loopback_test(struct e1000_adapter *adapter)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1396
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1397
	struct e1000_hw *hw = &adapter->hw;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1398
	uint32_t rctl;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1399
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1400
	if (hw->media_type == e1000_media_type_fiber ||
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1401
	    hw->media_type == e1000_media_type_internal_serdes) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1402
		switch (hw->mac_type) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1403
		case e1000_82545:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1404
		case e1000_82546:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1405
		case e1000_82545_rev_3:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1406
		case e1000_82546_rev_3:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1407
			return e1000_set_phy_loopback(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1408
			break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1409
		case e1000_82571:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1410
		case e1000_82572:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1411
#define E1000_SERDES_LB_ON 0x410
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1412
			e1000_set_phy_loopback(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1413
			E1000_WRITE_REG(hw, SCTL, E1000_SERDES_LB_ON);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1414
			msleep(10);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1415
			return 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1416
			break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1417
		default:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1418
			rctl = E1000_READ_REG(hw, RCTL);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1419
			rctl |= E1000_RCTL_LBM_TCVR;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1420
			E1000_WRITE_REG(hw, RCTL, rctl);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1421
			return 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1422
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1423
	} else if (hw->media_type == e1000_media_type_copper)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1424
		return e1000_set_phy_loopback(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1425
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1426
	return 7;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1427
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1428
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1429
static void
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1430
e1000_loopback_cleanup(struct e1000_adapter *adapter)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1431
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1432
	struct e1000_hw *hw = &adapter->hw;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1433
	uint32_t rctl;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1434
	uint16_t phy_reg;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1435
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1436
	rctl = E1000_READ_REG(hw, RCTL);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1437
	rctl &= ~(E1000_RCTL_LBM_TCVR | E1000_RCTL_LBM_MAC);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1438
	E1000_WRITE_REG(hw, RCTL, rctl);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1439
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1440
	switch (hw->mac_type) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1441
	case e1000_82571:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1442
	case e1000_82572:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1443
		if (hw->media_type == e1000_media_type_fiber ||
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1444
		    hw->media_type == e1000_media_type_internal_serdes) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1445
#define E1000_SERDES_LB_OFF 0x400
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1446
			E1000_WRITE_REG(hw, SCTL, E1000_SERDES_LB_OFF);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1447
			msleep(10);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1448
			break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1449
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1450
		/* Fall Through */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1451
	case e1000_82545:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1452
	case e1000_82546:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1453
	case e1000_82545_rev_3:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1454
	case e1000_82546_rev_3:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1455
	default:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1456
		hw->autoneg = TRUE;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1457
		if (hw->phy_type == e1000_phy_gg82563)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1458
			e1000_write_phy_reg(hw,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1459
					    GG82563_PHY_KMRN_MODE_CTRL,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1460
					    0x180);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1461
		e1000_read_phy_reg(hw, PHY_CTRL, &phy_reg);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1462
		if (phy_reg & MII_CR_LOOPBACK) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1463
			phy_reg &= ~MII_CR_LOOPBACK;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1464
			e1000_write_phy_reg(hw, PHY_CTRL, phy_reg);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1465
			e1000_phy_reset(hw);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1466
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1467
		break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1468
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1469
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1470
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1471
static void
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1472
e1000_create_lbtest_frame(struct sk_buff *skb, unsigned int frame_size)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1473
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1474
	memset(skb->data, 0xFF, frame_size);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1475
	frame_size &= ~1;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1476
	memset(&skb->data[frame_size / 2], 0xAA, frame_size / 2 - 1);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1477
	memset(&skb->data[frame_size / 2 + 10], 0xBE, 1);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1478
	memset(&skb->data[frame_size / 2 + 12], 0xAF, 1);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1479
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1480
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1481
static int
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1482
e1000_check_lbtest_frame(struct sk_buff *skb, unsigned int frame_size)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1483
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1484
	frame_size &= ~1;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1485
	if (*(skb->data + 3) == 0xFF) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1486
		if ((*(skb->data + frame_size / 2 + 10) == 0xBE) &&
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1487
		   (*(skb->data + frame_size / 2 + 12) == 0xAF)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1488
			return 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1489
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1490
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1491
	return 13;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1492
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1493
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1494
static int
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1495
e1000_run_loopback_test(struct e1000_adapter *adapter)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1496
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1497
	struct e1000_tx_ring *txdr = &adapter->test_tx_ring;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1498
	struct e1000_rx_ring *rxdr = &adapter->test_rx_ring;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1499
	struct pci_dev *pdev = adapter->pdev;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1500
	int i, j, k, l, lc, good_cnt, ret_val=0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1501
	unsigned long time;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1502
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1503
	E1000_WRITE_REG(&adapter->hw, RDT, rxdr->count - 1);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1504
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1505
	/* Calculate the loop count based on the largest descriptor ring
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1506
	 * The idea is to wrap the largest ring a number of times using 64
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1507
	 * send/receive pairs during each loop
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1508
	 */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1509
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1510
	if (rxdr->count <= txdr->count)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1511
		lc = ((txdr->count / 64) * 2) + 1;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1512
	else
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1513
		lc = ((rxdr->count / 64) * 2) + 1;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1514
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1515
	k = l = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1516
	for (j = 0; j <= lc; j++) { /* loop count loop */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1517
		for (i = 0; i < 64; i++) { /* send the packets */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1518
			e1000_create_lbtest_frame(txdr->buffer_info[i].skb,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1519
					1024);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1520
			pci_dma_sync_single_for_device(pdev,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1521
					txdr->buffer_info[k].dma,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1522
				    	txdr->buffer_info[k].length,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1523
				    	PCI_DMA_TODEVICE);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1524
			if (unlikely(++k == txdr->count)) k = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1525
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1526
		E1000_WRITE_REG(&adapter->hw, TDT, k);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1527
		msleep(200);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1528
		time = jiffies; /* set the start time for the receive */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1529
		good_cnt = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1530
		do { /* receive the sent packets */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1531
			pci_dma_sync_single_for_cpu(pdev,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1532
					rxdr->buffer_info[l].dma,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1533
				    	rxdr->buffer_info[l].length,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1534
				    	PCI_DMA_FROMDEVICE);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1535
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1536
			ret_val = e1000_check_lbtest_frame(
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1537
					rxdr->buffer_info[l].skb,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1538
				   	1024);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1539
			if (!ret_val)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1540
				good_cnt++;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1541
			if (unlikely(++l == rxdr->count)) l = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1542
			/* time + 20 msecs (200 msecs on 2.4) is more than
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1543
			 * enough time to complete the receives, if it's
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1544
			 * exceeded, break and error off
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1545
			 */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1546
		} while (good_cnt < 64 && jiffies < (time + 20));
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1547
		if (good_cnt != 64) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1548
			ret_val = 13; /* ret_val is the same as mis-compare */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1549
			break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1550
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1551
		if (jiffies >= (time + 2)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1552
			ret_val = 14; /* error code for time out error */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1553
			break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1554
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1555
	} /* end loop count loop */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1556
	return ret_val;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1557
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1558
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1559
static int
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1560
e1000_loopback_test(struct e1000_adapter *adapter, uint64_t *data)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1561
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1562
	/* PHY loopback cannot be performed if SoL/IDER
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1563
	 * sessions are active */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1564
	if (e1000_check_phy_reset_block(&adapter->hw)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1565
		DPRINTK(DRV, ERR, "Cannot do PHY loopback test "
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1566
		        "when SoL/IDER is active.\n");
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1567
		*data = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1568
		goto out;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1569
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1570
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1571
	if ((*data = e1000_setup_desc_rings(adapter)))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1572
		goto out;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1573
	if ((*data = e1000_setup_loopback_test(adapter)))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1574
		goto err_loopback;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1575
	*data = e1000_run_loopback_test(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1576
	e1000_loopback_cleanup(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1577
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1578
err_loopback:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1579
	e1000_free_desc_rings(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1580
out:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1581
	return *data;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1582
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1583
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1584
static int
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1585
e1000_link_test(struct e1000_adapter *adapter, uint64_t *data)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1586
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1587
	*data = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1588
	if (adapter->hw.media_type == e1000_media_type_internal_serdes) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1589
		int i = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1590
		adapter->hw.serdes_link_down = TRUE;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1591
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1592
		/* On some blade server designs, link establishment
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1593
		 * could take as long as 2-3 minutes */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1594
		do {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1595
			e1000_check_for_link(&adapter->hw);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1596
			if (adapter->hw.serdes_link_down == FALSE)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1597
				return *data;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1598
			msleep(20);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1599
		} while (i++ < 3750);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1600
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1601
		*data = 1;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1602
	} else {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1603
		e1000_check_for_link(&adapter->hw);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1604
		if (adapter->hw.autoneg)  /* if auto_neg is set wait for it */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1605
			msleep(4000);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1606
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1607
		if (!(E1000_READ_REG(&adapter->hw, STATUS) & E1000_STATUS_LU)) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1608
			*data = 1;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1609
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1610
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1611
	return *data;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1612
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1613
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1614
static int
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1615
e1000_diag_test_count(struct net_device *netdev)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1616
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1617
	return E1000_TEST_LEN;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1618
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1619
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1620
extern void e1000_power_up_phy(struct e1000_adapter *);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1621
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1622
static void
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1623
e1000_diag_test(struct net_device *netdev,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1624
		   struct ethtool_test *eth_test, uint64_t *data)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1625
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1626
	struct e1000_adapter *adapter = netdev_priv(netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1627
	boolean_t if_running = netif_running(netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1628
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1629
	set_bit(__E1000_TESTING, &adapter->flags);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1630
	if (eth_test->flags == ETH_TEST_FL_OFFLINE) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1631
		/* Offline tests */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1632
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1633
		/* save speed, duplex, autoneg settings */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1634
		uint16_t autoneg_advertised = adapter->hw.autoneg_advertised;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1635
		uint8_t forced_speed_duplex = adapter->hw.forced_speed_duplex;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1636
		uint8_t autoneg = adapter->hw.autoneg;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1637
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1638
		DPRINTK(HW, INFO, "offline testing starting\n");
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1639
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1640
		/* Link test performed before hardware reset so autoneg doesn't
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1641
		 * interfere with test result */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1642
		if (e1000_link_test(adapter, &data[4]))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1643
			eth_test->flags |= ETH_TEST_FL_FAILED;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1644
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1645
		if (if_running)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1646
			/* indicate we're in test mode */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1647
			dev_close(netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1648
		else
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1649
			e1000_reset(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1650
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1651
		if (e1000_reg_test(adapter, &data[0]))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1652
			eth_test->flags |= ETH_TEST_FL_FAILED;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1653
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1654
		e1000_reset(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1655
		if (e1000_eeprom_test(adapter, &data[1]))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1656
			eth_test->flags |= ETH_TEST_FL_FAILED;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1657
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1658
		e1000_reset(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1659
		if (e1000_intr_test(adapter, &data[2]))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1660
			eth_test->flags |= ETH_TEST_FL_FAILED;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1661
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1662
		e1000_reset(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1663
		/* make sure the phy is powered up */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1664
		e1000_power_up_phy(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1665
		if (e1000_loopback_test(adapter, &data[3]))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1666
			eth_test->flags |= ETH_TEST_FL_FAILED;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1667
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1668
		/* restore speed, duplex, autoneg settings */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1669
		adapter->hw.autoneg_advertised = autoneg_advertised;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1670
		adapter->hw.forced_speed_duplex = forced_speed_duplex;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1671
		adapter->hw.autoneg = autoneg;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1672
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1673
		e1000_reset(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1674
		clear_bit(__E1000_TESTING, &adapter->flags);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1675
		if (if_running)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1676
			dev_open(netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1677
	} else {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1678
		DPRINTK(HW, INFO, "online testing starting\n");
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1679
		/* Online tests */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1680
		if (e1000_link_test(adapter, &data[4]))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1681
			eth_test->flags |= ETH_TEST_FL_FAILED;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1682
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1683
		/* Online tests aren't run; pass by default */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1684
		data[0] = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1685
		data[1] = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1686
		data[2] = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1687
		data[3] = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1688
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1689
		clear_bit(__E1000_TESTING, &adapter->flags);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1690
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1691
	msleep_interruptible(4 * 1000);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1692
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1693
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1694
static int e1000_wol_exclusion(struct e1000_adapter *adapter, struct ethtool_wolinfo *wol)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1695
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1696
	struct e1000_hw *hw = &adapter->hw;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1697
	int retval = 1; /* fail by default */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1698
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1699
	switch (hw->device_id) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1700
	case E1000_DEV_ID_82542:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1701
	case E1000_DEV_ID_82543GC_FIBER:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1702
	case E1000_DEV_ID_82543GC_COPPER:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1703
	case E1000_DEV_ID_82544EI_FIBER:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1704
	case E1000_DEV_ID_82546EB_QUAD_COPPER:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1705
	case E1000_DEV_ID_82545EM_FIBER:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1706
	case E1000_DEV_ID_82545EM_COPPER:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1707
	case E1000_DEV_ID_82546GB_QUAD_COPPER:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1708
	case E1000_DEV_ID_82546GB_PCIE:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1709
		/* these don't support WoL at all */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1710
		wol->supported = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1711
		break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1712
	case E1000_DEV_ID_82546EB_FIBER:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1713
	case E1000_DEV_ID_82546GB_FIBER:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1714
	case E1000_DEV_ID_82571EB_FIBER:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1715
	case E1000_DEV_ID_82571EB_SERDES:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1716
	case E1000_DEV_ID_82571EB_COPPER:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1717
		/* Wake events not supported on port B */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1718
		if (E1000_READ_REG(hw, STATUS) & E1000_STATUS_FUNC_1) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1719
			wol->supported = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1720
			break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1721
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1722
		/* return success for non excluded adapter ports */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1723
		retval = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1724
		break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1725
	case E1000_DEV_ID_82571EB_QUAD_COPPER:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1726
	case E1000_DEV_ID_82571EB_QUAD_COPPER_LOWPROFILE:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1727
	case E1000_DEV_ID_82546GB_QUAD_COPPER_KSP3:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1728
		/* quad port adapters only support WoL on port A */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1729
		if (!adapter->quad_port_a) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1730
			wol->supported = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1731
			break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1732
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1733
		/* return success for non excluded adapter ports */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1734
		retval = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1735
		break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1736
	default:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1737
		/* dual port cards only support WoL on port A from now on
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1738
		 * unless it was enabled in the eeprom for port B
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1739
		 * so exclude FUNC_1 ports from having WoL enabled */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1740
		if (E1000_READ_REG(hw, STATUS) & E1000_STATUS_FUNC_1 &&
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1741
		    !adapter->eeprom_wol) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1742
			wol->supported = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1743
			break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1744
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1745
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1746
		retval = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1747
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1748
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1749
	return retval;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1750
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1751
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1752
static void
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1753
e1000_get_wol(struct net_device *netdev, struct ethtool_wolinfo *wol)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1754
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1755
	struct e1000_adapter *adapter = netdev_priv(netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1756
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1757
	wol->supported = WAKE_UCAST | WAKE_MCAST |
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1758
	                 WAKE_BCAST | WAKE_MAGIC;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1759
	wol->wolopts = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1760
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1761
	/* this function will set ->supported = 0 and return 1 if wol is not
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1762
	 * supported by this hardware */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1763
	if (e1000_wol_exclusion(adapter, wol))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1764
		return;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1765
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1766
	/* apply any specific unsupported masks here */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1767
	switch (adapter->hw.device_id) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1768
	case E1000_DEV_ID_82546GB_QUAD_COPPER_KSP3:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1769
		/* KSP3 does not suppport UCAST wake-ups */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1770
		wol->supported &= ~WAKE_UCAST;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1771
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1772
		if (adapter->wol & E1000_WUFC_EX)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1773
			DPRINTK(DRV, ERR, "Interface does not support "
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1774
		        "directed (unicast) frame wake-up packets\n");
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1775
		break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1776
	default:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1777
		break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1778
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1779
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1780
	if (adapter->wol & E1000_WUFC_EX)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1781
		wol->wolopts |= WAKE_UCAST;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1782
	if (adapter->wol & E1000_WUFC_MC)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1783
		wol->wolopts |= WAKE_MCAST;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1784
	if (adapter->wol & E1000_WUFC_BC)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1785
		wol->wolopts |= WAKE_BCAST;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1786
	if (adapter->wol & E1000_WUFC_MAG)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1787
		wol->wolopts |= WAKE_MAGIC;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1788
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1789
	return;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1790
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1791
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1792
static int
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1793
e1000_set_wol(struct net_device *netdev, struct ethtool_wolinfo *wol)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1794
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1795
	struct e1000_adapter *adapter = netdev_priv(netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1796
	struct e1000_hw *hw = &adapter->hw;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1797
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1798
	if (wol->wolopts & (WAKE_PHY | WAKE_ARP | WAKE_MAGICSECURE))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1799
		return -EOPNOTSUPP;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1800
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1801
	if (e1000_wol_exclusion(adapter, wol))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1802
		return wol->wolopts ? -EOPNOTSUPP : 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1803
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1804
	switch (hw->device_id) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1805
	case E1000_DEV_ID_82546GB_QUAD_COPPER_KSP3:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1806
		if (wol->wolopts & WAKE_UCAST) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1807
			DPRINTK(DRV, ERR, "Interface does not support "
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1808
		        "directed (unicast) frame wake-up packets\n");
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1809
			return -EOPNOTSUPP;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1810
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1811
		break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1812
	default:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1813
		break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1814
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1815
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1816
	/* these settings will always override what we currently have */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1817
	adapter->wol = 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1818
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1819
	if (wol->wolopts & WAKE_UCAST)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1820
		adapter->wol |= E1000_WUFC_EX;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1821
	if (wol->wolopts & WAKE_MCAST)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1822
		adapter->wol |= E1000_WUFC_MC;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1823
	if (wol->wolopts & WAKE_BCAST)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1824
		adapter->wol |= E1000_WUFC_BC;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1825
	if (wol->wolopts & WAKE_MAGIC)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1826
		adapter->wol |= E1000_WUFC_MAG;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1827
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1828
	return 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1829
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1830
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1831
/* toggle LED 4 times per second = 2 "blinks" per second */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1832
#define E1000_ID_INTERVAL	(HZ/4)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1833
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1834
/* bit defines for adapter->led_status */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1835
#define E1000_LED_ON		0
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1836
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1837
static void
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1838
e1000_led_blink_callback(unsigned long data)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1839
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1840
	struct e1000_adapter *adapter = (struct e1000_adapter *) data;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1841
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1842
	if (test_and_change_bit(E1000_LED_ON, &adapter->led_status))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1843
		e1000_led_off(&adapter->hw);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1844
	else
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1845
		e1000_led_on(&adapter->hw);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1846
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1847
	mod_timer(&adapter->blink_timer, jiffies + E1000_ID_INTERVAL);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1848
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1849
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1850
static int
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1851
e1000_phys_id(struct net_device *netdev, uint32_t data)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1852
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1853
	struct e1000_adapter *adapter = netdev_priv(netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1854
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1855
	if (!data || data > (uint32_t)(MAX_SCHEDULE_TIMEOUT / HZ))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1856
		data = (uint32_t)(MAX_SCHEDULE_TIMEOUT / HZ);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1857
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1858
	if (adapter->hw.mac_type < e1000_82571) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1859
		if (!adapter->blink_timer.function) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1860
			init_timer(&adapter->blink_timer);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1861
			adapter->blink_timer.function = e1000_led_blink_callback;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1862
			adapter->blink_timer.data = (unsigned long) adapter;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1863
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1864
		e1000_setup_led(&adapter->hw);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1865
		mod_timer(&adapter->blink_timer, jiffies);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1866
		msleep_interruptible(data * 1000);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1867
		del_timer_sync(&adapter->blink_timer);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1868
	} else if (adapter->hw.phy_type == e1000_phy_ife) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1869
		if (!adapter->blink_timer.function) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1870
			init_timer(&adapter->blink_timer);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1871
			adapter->blink_timer.function = e1000_led_blink_callback;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1872
			adapter->blink_timer.data = (unsigned long) adapter;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1873
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1874
		mod_timer(&adapter->blink_timer, jiffies);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1875
		msleep_interruptible(data * 1000);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1876
		del_timer_sync(&adapter->blink_timer);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1877
		e1000_write_phy_reg(&(adapter->hw), IFE_PHY_SPECIAL_CONTROL_LED, 0);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1878
	} else {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1879
		e1000_blink_led_start(&adapter->hw);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1880
		msleep_interruptible(data * 1000);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1881
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1882
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1883
	e1000_led_off(&adapter->hw);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1884
	clear_bit(E1000_LED_ON, &adapter->led_status);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1885
	e1000_cleanup_led(&adapter->hw);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1886
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1887
	return 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1888
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1889
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1890
static int
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1891
e1000_nway_reset(struct net_device *netdev)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1892
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1893
	struct e1000_adapter *adapter = netdev_priv(netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1894
	if (netif_running(netdev))
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1895
		e1000_reinit_locked(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1896
	return 0;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1897
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1898
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1899
static int
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1900
e1000_get_stats_count(struct net_device *netdev)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1901
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1902
	return E1000_STATS_LEN;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1903
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1904
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1905
static void
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1906
e1000_get_ethtool_stats(struct net_device *netdev,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1907
		struct ethtool_stats *stats, uint64_t *data)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1908
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1909
	struct e1000_adapter *adapter = netdev_priv(netdev);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1910
	int i;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1911
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1912
	e1000_update_stats(adapter);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1913
	for (i = 0; i < E1000_GLOBAL_STATS_LEN; i++) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1914
		char *p = (char *)adapter+e1000_gstrings_stats[i].stat_offset;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1915
		data[i] = (e1000_gstrings_stats[i].sizeof_stat ==
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1916
			sizeof(uint64_t)) ? *(uint64_t *)p : *(uint32_t *)p;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1917
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1918
/*	BUG_ON(i != E1000_STATS_LEN); */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1919
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1920
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1921
static void
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1922
e1000_get_strings(struct net_device *netdev, uint32_t stringset, uint8_t *data)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1923
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1924
	uint8_t *p = data;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1925
	int i;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1926
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1927
	switch (stringset) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1928
	case ETH_SS_TEST:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1929
		memcpy(data, *e1000_gstrings_test,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1930
			E1000_TEST_LEN*ETH_GSTRING_LEN);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1931
		break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1932
	case ETH_SS_STATS:
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1933
		for (i = 0; i < E1000_GLOBAL_STATS_LEN; i++) {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1934
			memcpy(p, e1000_gstrings_stats[i].stat_string,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1935
			       ETH_GSTRING_LEN);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1936
			p += ETH_GSTRING_LEN;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1937
		}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1938
/*		BUG_ON(p - data != E1000_STATS_LEN * ETH_GSTRING_LEN); */
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1939
		break;
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1940
	}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1941
}
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1942
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1943
static const struct ethtool_ops e1000_ethtool_ops = {
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1944
	.get_settings           = e1000_get_settings,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1945
	.set_settings           = e1000_set_settings,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1946
	.get_drvinfo            = e1000_get_drvinfo,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1947
	.get_regs_len           = e1000_get_regs_len,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1948
	.get_regs               = e1000_get_regs,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1949
	.get_wol                = e1000_get_wol,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1950
	.set_wol                = e1000_set_wol,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1951
	.get_msglevel           = e1000_get_msglevel,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1952
	.set_msglevel           = e1000_set_msglevel,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1953
	.nway_reset             = e1000_nway_reset,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1954
	.get_link               = ethtool_op_get_link,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1955
	.get_eeprom_len         = e1000_get_eeprom_len,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1956
	.get_eeprom             = e1000_get_eeprom,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1957
	.set_eeprom             = e1000_set_eeprom,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1958
	.get_ringparam          = e1000_get_ringparam,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1959
	.set_ringparam          = e1000_set_ringparam,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1960
	.get_pauseparam         = e1000_get_pauseparam,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1961
	.set_pauseparam         = e1000_set_pauseparam,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1962
	.get_rx_csum            = e1000_get_rx_csum,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1963
	.set_rx_csum            = e1000_set_rx_csum,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1964
	.get_tx_csum            = e1000_get_tx_csum,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1965
	.set_tx_csum            = e1000_set_tx_csum,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1966
	.get_sg                 = ethtool_op_get_sg,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1967
	.set_sg                 = ethtool_op_set_sg,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1968
	.get_tso                = ethtool_op_get_tso,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1969
	.set_tso                = e1000_set_tso,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1970
	.self_test_count        = e1000_diag_test_count,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1971
	.self_test              = e1000_diag_test,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1972
	.get_strings            = e1000_get_strings,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1973
	.phys_id                = e1000_phys_id,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1974
	.get_stats_count        = e1000_get_stats_count,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1975
	.get_ethtool_stats      = e1000_get_ethtool_stats,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1976
	.get_perm_addr          = ethtool_op_get_perm_addr,
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1977
};
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1978
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1979
void e1000_set_ethtool_ops(struct net_device *netdev)
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1980
{
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1981
	SET_ETHTOOL_OPS(netdev, &e1000_ethtool_ops);
9999ca1a1953 Added e1000 driver for 2.6.22 (not patched yet).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1982
}