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